2011-12-30 13 views
0

D3DXVec3TransformとD3DXVec3TransformCoord関数がどのように動作しているかを調べていますが、これが正しい方法であるかどうか疑問に思っていました。私は、これを行うためのDirectXの機能がすでにあることを理解していますが、私は舞台裏での数学やこれからの研究についてもっと学びたいと思っています。Vector3 TransformとTransformCoordinateを正しく計算する方法はありますか?

D3DXVECTOR3 Vec3Transform(D3DXVECTOR3 &vCoordinate, D3DXMATRIX &mTransform) 
{ 
    D3DXVECTOR3 vWorking; 

    vWorking.x = (vCoordinate.x * mTransform._11) + (vCoordinate.y * mTransform._21) + (vCoordinate.z * mTransform._31) + mTransform._41; 
    vWorking.y = (vCoordinate.x * mTransform._12) + (vCoordinate.y * mTransform._22) + (vCoordinate.z * mTransform._32) + mTransform._42; 
    vWorking.z = (vCoordinate.x * mTransform._13) + (vCoordinate.y * mTransform._23) + (vCoordinate.z * mTransform._33) + mTransform._43; 

    return D3DXVECTOR3(vWorking.x, vWorking.y, vWorking.z); 
} 

D3DXVECTOR3 Vec3TransformCoordinate(D3DXVECTOR3 &vCoordinate, D3DXMATRIX &mTransform) 
{ 
    D3DXVECTOR4 vWorking; 

    vWorking.x = (vCoordinate.x * mTransform._11) + (vCoordinate.y * mTransform._21) + (vCoordinate.z * mTransform._31) + mTransform._41; 
    vWorking.y = (vCoordinate.x * mTransform._12) + (vCoordinate.y * mTransform._22) + (vCoordinate.z * mTransform._32) + mTransform._42; 
    vWorking.z = (vCoordinate.x * mTransform._13) + (vCoordinate.y * mTransform._23) + (vCoordinate.z * mTransform._33) + mTransform._43; 
    vWorking.w = 1/((vCoordinate.x * mTransform._14) + (vCoordinate.y * mTransform._24) + (vCoordinate.z * mTransform._34) + mTransform._44); 

    return D3DXVECTOR3(vWorking.x * vWorking.w, vWorking.y * vWorking.w, vWorking.z * vWorking.w); 
} 

答えて

0

D3DXライブラリで同様の機能を見てから、あなたが忠実にその機能を実装しているようです。

(x、y、z、0)を4x4行列で変換する関数を持つと、オブジェクトのベロシティやサーフェスの法線などの方向を変換するときに便利です。ベクトルは、翻訳が適用されずに変形され、方向を崩してしまいます。

+0

D3DXMATRIXは4x4の行列ですが、答えについてのあなたの意見は変わりますか? – judeclarke