小编Paw*_*arz的帖子

C++中的度量单位

我正在研究游戏引擎,目前我不得不设计IO系统.我已经做到了,引擎本身不处理任何文件格式,而是让用户通过创建*.dll具有适当命名函数的文件来实现他想要的任何东西.虽然这本身并不是什么大问题,但我主要担心的是在发动机使用过程中可能会出现的影响.

我设计了一个简单的resource接口作为用户可以想到的所有东西的基类,我试图通过创建专用于常见数据类型的简单子类来扩展它,因此用户不必实现基础知识由他本人(目前我在想audio,image,datamesh).从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只需要数量级而不确保单位与其他单位不兼容.

另请注意我使用旧 …

c++ design-patterns units-of-measurement

16
推荐指数
3
解决办法
8559
查看次数

这个头的含义是什么(virtual const char*what()const throw())?

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()是什么,从未见过这种语法.

c++ exception

14
推荐指数
1
解决办法
5587
查看次数

从函数返回一个不可变的POD类

上下文

我正在开发一个由不同模块组合而成的大型项目.我们有exporter一个模板功能export<T>(const T& obj),其工作只是在POD类型(它static_assertis_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)

c++ design-patterns immutability c++11

6
推荐指数
1
解决办法
459
查看次数

OpenGL中DirectX文件的骨架动画

我正在尝试将*.x文件导入我的引擎并使用OpenGL动画它们(目前没有着色器,但现在这并不是真正相关).我在MSDN上找到了格式参考,但它在问题上没有多大帮助.

所以 - 基本上 - 我已经创建了一个文件,其中包含一个类似恶魔的简单动画,有7个骨骼(主要,尾部2个,腿部4个),其中只有2个(右腿)现在是动画.我已经在DXViewer中测试了网格,它似乎在那里工作得很好,所以问题必须是我的代码的一面.

当我导出网格物体时,我得到一个包含大量信息的文件,其中有三个重要的位置用于骨架动画(以下所有矩阵都用于RLeg2骨骼):

  1. 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)
  2. 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)
  3. 绑定姿势中的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/),但那里只有一个矩阵.问题是 - 如何组合这些矩阵来获得顶点变换矩阵

c++ opengl directx animation

2
推荐指数
1
解决办法
3095
查看次数