Используя XMMatrixLookAtLH - пытаетесь столкнуться с точкой, но не работает / падает?

Я использую этот код для моего класса 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. Объект "а" неуместно расположен в странной позиции. 3. Объект "а" исчезает.

Эта чертова функция XMMatrixLookAtLH была источником проблем во всем моем проекте, везде, где я использовал его, мне приходилось тратить часы, чтобы заставить его работать должным образом.

Если я создаю матрицу вращения с помощью XMMatrixRotationRollPitchYawFromVector, она отлично работает, однако мне НУЖНО, чтобы она смотрела прямо в точку, в которой она была задана, и я не знаю, как заставить ее работать. Пожалуйста, кто-нибудь даст мне совет.

1 ответ

Решение

Какое именно утверждение неверно? Это ключ к пониманию проблемы.

assert(!XMVector3Equal(EyeDirection, XMVectorZero()));
assert(!XMVector3IsInfinite(EyeDirection));
assert(!XMVector3Equal(UpDirection, XMVectorZero()));
assert(!XMVector3IsInfinite(UpDirection));

Поскольку вы используете XMVECTOR и XMMATRIX в качестве членов класса, вы убедились, что Entity вашего класса всегда выделяется с 16-байтовым выравниванием? Это гарантировано только в 64-битных (64-битных) нативных программах по умолчанию. Если вы пишете 32-битное приложение, вам нужно использовать функции XMLoad*/XMStore* и избегать использования XMVECTOR и XMMATRIX непосредственно в вашем классе. Убедитесь, что вы знаете разницу между моментом срабатывания точки останова утверждения C и моментом, когда вы получаете исключение, например, "нарушение доступа" из-за выравнивания.

Вы можете обнаружить, что использование SimpleMathнаборе инструментов DirectX) более естественно для использования, чем непосредственное использование DirectXMath, но обычно оно основано на координатах RH.

Другие вопросы по тегам