1

我将此代码用于我的 Entity 类:

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.Entity 'a' 被放错了一个奇怪的位置 3.Entity 'a'消失了

这个该死的函数 XMMatrixLookAtLH 一直是我项目中问题的根源,无论我在哪里使用它,我都必须花费数小时才能让它正常工作。

如果我使用 XMMatrixRotationRollPitchYawFromVector 创建旋转矩阵,它可以完美地工作,但是我需要让它直接面对给出的点,我不知道如何让它工作。请有人给我一个建议。

4

1 回答 1

3

确切失败的断言是什么?这就是问题所在的线索。

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 Tool Kit中)比直接使用 DirectXMath 更自然,但它通常是围绕 RH 坐标设计的。

于 2014-06-29T00:47:18.843 回答