Используя 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);

И что происходит, это одна из 3 вещей:
1. Функция вылетает из-за утверждения
2. Сущность ‘a’ находится в странном положении
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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector