2017-01-04 24 views
0

こんにちは、私はDirectX 11を初めて使用しています。私は自分のゲームオブジェクトを回転に基づいて前進させようとしています。これは私が持っているものですが、それを回すかどうかにかかわらず、行に移動するだけです。directx 11回転に基づいてオブジェクトを移動する

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

行列は、最上部の行に尺度がなく、2番目の行に尺度があり、3番目に訳がありません。彼らはそれより複雑です。

マトリックスを分解するには、XMMatrixDecomposeを使用します。構成を戻すには、XMMatrixTranslationFromVector、XMMatrixRotationQuaternion、XMMatrixScalingFromVectorを使用して結果を掛けることができます。

幸いにも、オブジェクトをローカル座標に移動するには(それが必要な場合)、マトリックスを分解する必要はありません。 を使用してlocalTranslation行列を構築し、ワールド行列をXMMatrixMultiply(localTranslation, _world)

P.S.に更新する必要があります。私はそのようなもののためにDirectX Toolkit libraryをお勧めします。特にDirectXを初めてお使いの方には最適です。 SimpleMath.hヘッダーには、これらのベクトルと行列の周りの使いやすいラッパーが含まれています。

+0

迅速な対応に感謝します。私がここ数日にわたってやろうとしてきたことは、オブジェクトが直面している方向に動かすことです。私はdirectxのツールキットを使えないので、私にとっては基本的なdirectx 11なので、私は一般的にそれがやりやすいと信じていました。 – RattlerCreed

関連する問題