我有一个简单的IRenderable类,该类具有用于位置,缩放和旋转的成员:

XMFLOAT3 _position;
XMFLOAT3 _scaling;
XMVECTOR _rotation;

我试图用构造函数设置它们。此处的第一个方法给出尝试设置_rotation的访问冲突0x00000000(设置_position和_scaling都正确):
IRenderable() : _position(XMFLOAT3(0, 0, 0)), _scaling(XMFLOAT3(1, 1, 1)), _rotation(XMQuaternionIdentity()) { }

将_rotation改为XMVECTOR *并在构造函数中使用_rotation(new XMVECTOR())会将其设置为空XMVECTOR,但是稍后在尝试设置标识四元数时会引发访问冲突:
*_rotation = XMQuaternionIdentity();

创建对象时,在构造函数中使用XMQuaternionIdentity的地址可以正常工作,
IRenderable() : _position(new XMFLOAT3(0, 0, 0)), _scaling(new XMFLOAT3(1, 1, 1)), _rotation(&XMQuaternionIdentity()) { }

但随后,四元数本身就需要包含垃圾数据以进行渲染。在所有这些情况下,_position和_scaling都可以正常工作。

在这种情况下使用XMVECTOR的正确正确方法是什么?

最佳答案

通常,应避免在结构中使用XMVECTOR。 XMFLOAT#类是存储类,应用于常规存储。但是,如果您声明结构对齐,则可以使用XMVECTOR。

http://msdn.microsoft.com/en-us/library/83ythb65.aspx



但我相信,如果执行此操作,则其中每个带有A的结构也必须对齐16字节(或32、48等)。通常,使用存储类更加容易和清楚,只需在进行一些计算(XMLoadFloat4)并将其存储回XMFLOAT#(XMStoreFloat4)时或转换为XMVECTOR或XMMATRIX时使用函数的值(一定要读取http://msdn.microsoft.com/en-us/library/windows/desktop/ee418728(v=vs.85).aspx),或者从函数返回值。

关于c++ - 如何正确使用XMVECTOR成员变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6809372/

10-10 14:06