我正在研究游戏引擎,目前我不得不设计IO系统.我已经做到了,引擎本身不处理任何文件格式,而是让用户通过创建*.dll具有适当命名函数的文件来实现他想要的任何东西.虽然这本身并不是什么大问题,但我主要担心的是在发动机使用过程中可能会出现的影响.
我设计了一个简单的resource接口作为用户可以想到的所有东西的基类,我试图通过创建专用于常见数据类型的简单子类来扩展它,因此用户不必实现基础知识由他本人(目前我在想audio,image,data和mesh).从audio课堂开始,我偶然发现了一个特殊的问题,同时试图决定应该以什么类型存储有关采样率的信息.通常的单位是赫兹,所以我决定把它变成一个unsigned int.
但是这里有一点问题 - 如果用户试图用千赫兹设置它会怎么样?让我们假设一些抽象文件格式可以暂时将它存储在两个单元中.我已经创建了一个简单的包装类来命名单元类型:
class hertz{
private:
unsigned int value;
hertz(){};
public:
operator unsigned int();
hertz(unsigned int value);
};
Run Code Online (Sandbox Code Playgroud)
并决定让用户也使用kHz:
class kilohertz{
private:
float value;
kilohertz(){};
public:
operator hertz();
kilohertz(float value);
};
Run Code Online (Sandbox Code Playgroud)
虽然audio类中的函数允许用户设置采样率,但声明为track& samplingRate(units::hertz rate);.用户必须通过明确说出他正在使用的数量级来调用它:
someAudioFile.samplingRate(hertz(44100));
someAudioFile.samplingRate(kilohertz(44.1));
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否有更好的方法迫使用户以简单而优雅的方式使用测量单元?一个设计模式可能,或者一些巧妙使用typedef?
另请注意,在创建引擎的过程中,我可能需要更多与Hertz不兼容的单元.从我的头脑 - 我可能希望用户能够通过做units::rgb(123,42,120)和设置像素颜色units::hsl(10,30,240).
我已经尝试寻找一个可行的答案并且只找到了这个问题,但OP只需要数量级而不确保单位与其他单位不兼容.
另请注意我使用旧 …
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
};
Run Code Online (Sandbox Code Playgroud)
对不起,这个问题可能听起来很愚蠢,但我在解析标题时遇到了问题.有人能用英语描述标题的实际含义吗?对我来说,首先看起来很奇怪的是关键字virtual.该myexception班是不是一个基类,从已经实施的继承exception类,所以为什么还要用virtual在这里?我猜const是返回类型是一个c风格的字符串是const,另一个const是确保这个对象不能被修改(有人可以告诉我该对象可能是什么?).我不知道究竟throw()是什么,从未见过这种语法.
我正在开发一个由不同模块组合而成的大型项目.我们有exporter一个模板功能export<T>(const T& obj),其工作只是在POD类型(它static_assert的is_pod,如果你很好奇).目前我坐在系统的一部分,负责编目由元数据描述的一些实体(它们的类型无关紧要).元数据本身由一些被调用的函数返回metadata describe(const entity& obj),并且在返回后应该是不可变的.当然,函数本身将metadata成员设置在其体内.
由于上面提到的事实,我需要设计一个const POD类型.由于POD类型不能具有用户定义的构造函数,因此成员变量本身不能const.const直接从值返回变量describe 是没有意义的(或者至少可以说没有帮助).
所以基本上我到目前为止所想到的是:
exporter.export<T>(...)的metadata,但因为它只能解决当前类的问题,这不是一个真正的解决方案,同时在最终产品中会出现许多类型的实体(我不是在谈论.重载函数用于所有类型的似乎只是错误.immutable包装并从中返回describe.这就是我目前正在做的事情,因为我无法找到解决问题的更好方法.包装器提供隐式转换const &T并存储T自身内部,因此可以直接传递给export函数.有没有更好的方法从函数返回不可变的POD类?我错过了什么吗?为简单起见,假设假设metadata定义如下:
struct metadata{
int parameter1;
time_t parameter2;
};
Run Code Online (Sandbox Code Playgroud)
并按describe如下方式工作(目前,跳过当前的解决方案):
metadata describe(const entity& obj){
metadata …Run Code Online (Sandbox Code Playgroud) 我正在尝试将*.x文件导入我的引擎并使用OpenGL动画它们(目前没有着色器,但现在这并不是真正相关).我在MSDN上找到了格式参考,但它在问题上没有多大帮助.
所以 - 基本上 - 我已经创建了一个文件,其中包含一个类似恶魔的简单动画,有7个骨骼(主要,尾部2个,腿部4个),其中只有2个(右腿)现在是动画.我已经在DXViewer中测试了网格,它似乎在那里工作得很好,所以问题必须是我的代码的一面.
当我导出网格物体时,我得到一个包含大量信息的文件,其中有三个重要的位置用于骨架动画(以下所有矩阵都用于RLeg2骨骼):
SkinWeights - matrixOffset
-0.361238, -0.932141, -0.024957, 0.000000,
0.081428, -0.004872, -0.996669, 0.000000,
0.928913, -0.362066, 0.077663, 0.000000,
0.139213, -0.057892, -0.009323, 1.000000
Run Code Online (Sandbox Code Playgroud)FrameTransformMatrix
0.913144, 0.000000, -0.407637, 0.000000,
0.069999, 0.985146, 0.156804, 0.000000,
0.401582, -0.171719, 0.899580, 0.000000,
0.000000, -0.000000, 0.398344, 1.000000
Run Code Online (Sandbox Code Playgroud)绑定姿势中的AnimationKey矩阵
0.913144, 0.000000, -0.407637, 0.000000,
0.069999, 0.985146, 0.156804, 0.000000,
0.401582, -0.171719, 0.899580, 0.000000,
0.000000, -0.000000, 0.398344, 1.000000
Run Code Online (Sandbox Code Playgroud)我的问题是 - 我对这些矩阵做了什么?我在纽卡斯尔大学网站上找到了一个等式(http://research.ncl.ac.uk/game/mastersdegree/graphicsforgames/skeletalanimation/),但那里只有一个矩阵.问题是 - 如何组合这些矩阵来获得顶点变换矩阵?