Я использую этот код для моего класса 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, она отлично работает, однако мне НУЖНО, чтобы она смотрела прямо в точку, в которой она была задана, и я не знаю, как заставить ее работать. Пожалуйста, кто-нибудь даст мне совет.
Какое именно утверждение неверно? Это ключ к пониманию проблемы.
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.
Других решений пока нет …