2017-01-04 9 views
0

Привет, я новичок в использовании DirectX 11, и я просто пытаюсь заставить свой игровой объект двигаться вперед в зависимости от его вращения. Это то, что у меня есть, но оно просто движется по линии, независимо от того, превращается ли я в него или нет.directx 11 move object на основе вращения

void Object::MoveObject(float x, float y, float z) 
{ 

    Position.x += x; 
    Position.y += y; 
    Position.z += z; 

    _translate = XMMatrixIdentity(); 
    _translate *= XMMatrixTranslation(Position.x, Position.y, Position.z); 

    XMVECTOR forward = { Position.x,Position.y,Position.z }; 
    XMFLOAT4X4 currrentWorld = GetWorld(); 
    XMMATRIX currentWorldM = XMLoadFloat4x4(&currrentWorld); 

    XMVECTOR scale = currentWorldM.r[0]; 
    XMVECTOR rotation = currentWorldM.r[1]; 
    XMVECTOR translation = currentWorldM.r[2]; 
    forward *= currentWorldM.r[3]; 

    forward = XMVector3Normalize(forward); 

    translation = XMVectorAdd(translation, forward); 

    XMStoreFloat4x4(&_world, XMMATRIX(scale, rotation, translation, forward)); 

    UpdateWorld(); 
} 
+0

http://stackoverflow.com/questions/35393594/directx-matrix-translation-in-local-axis – Eddge

ответ

1

Матрица не содержит шкалы в верхнем ряду, вращение во втором и перевод в третьем. Они сложнее, чем это.

Чтобы разложить матрицу, вы можете использовать XMMatrixDecompose. Для создания назад вы можете использовать XMMatrixTranslationFromVector, XMMatrixRotationQuaternion, XMMatrixScalingFromVector и умножить результаты.

К счастью, для перемещения объекта в его локальные координаты (если это то, что вы хотите) вам не нужно разлагать матрицу. Вам необходимо построить матрицу localTranslation с использованием XMMatrixTranslationFromVector и обновить свою мировую матрицу до XMMatrixMultiply(localTranslation, _world)

P.S. Я рекомендую DirectX Toolkit library за такие вещи. Особенно, если вы новичок в DirectX. Заголовок SimpleMath.h содержит простые в использовании обертки вокруг этих векторов и матриц.

+0

Благодарим за быстрый ответ. В течение последних нескольких дней я пытаюсь заставить объект двигаться в том направлении, в котором он находится. Я не могу использовать инструментарий directx, поскольку он предназначен для назначения, поэтому для меня просто базовый directx 11. Я вообще считал, что это будет легко сделать. – RattlerCreed

 Смежные вопросы

  • Нет связанных вопросов^_^