我正在为我的实体类使用以下代码:
void Entity::Face(FXMVECTOR target)
{
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
up = XMVector3Transform(up, Rotation);
Rotation = XMMatrixLookAtLH(Translation, target, up); //Rotation is a XMMATRIX, Translation is a XMVECTOR
}
并试图让它面对另一个实体。基本上我正在这样做:
Entity a = //....
Entity b = //.......
a.Face(b.Translation);
发生的事情是以下三件事之一:1.函数崩溃,因为断言2.实体"a"被错误地放在一个奇怪的位置3.实体"a"消失
这个该死的函数XMMatrixLookAtLH一直是我整个项目问题的根源,无论我在哪里使用它,我都必须花费数小时才能使其正常工作。
如果我使用 XMMatrixRotationRollPitchYawFromVector 创建旋转矩阵,它可以完美运行,但是我需要让它直接面对它被给出的点,我不知道如何让它工作。请有人给我一个建议。
的断言到底是什么?这就是问题可能是什么的线索。
assert(!XMVector3Equal(EyeDirection, XMVectorZero()));
assert(!XMVector3IsInfinite(EyeDirection));
assert(!XMVector3Equal(UpDirection, XMVectorZero()));
assert(!XMVector3IsInfinite(UpDirection));
既然您使用 XMVECTOR 和 XMMATRIX 作为类成员,您是否确保你的类实体始终分配 16 字节对齐方式?默认情况下,这仅在 x64(64 位)本机程序中得到保证。如果您正在编写 32 位应用程序,则需要使用 XMLoad*/XMStore* 函数,并避免直接在类中使用 XMVECTOR 和 XMMATRIX。确保您知道触发 C 断言断点的时间与由于对齐而实际引发的异常(如"访问冲突")之间的区别。
您可能会发现使用 SimpleMath(在 DirectX 工具包中)比直接使用 DirectXMath 更自然,但它通常是围绕 RH 坐标设计的。