2011-12-30 93 views
0

我一直在寻找D3DXVec3Transform和D3DXVec3TransformCoord函数如何操作,想知道这是否是数学的正确方法,如果不是的话,是否有人可以解释为什么。我知道已经有DirectX函数可以做到这一点,但是,我一直试图更多地了解幕后数学和我从这方面进行的研究。这是你如何正确计算Vector3变换和变换坐标?

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库中类似的功能看来,你已经实现了他们的功能忠实。

它也可能有助于使用4x4矩阵变换(x,y,z,0)的函数,因为这在翻译方向时非常有用,例如对象的速度或表面的法线。矢量将被转换而不被应用翻译,这会破坏方向。

+0

D3DXMATRIX是一个4x4矩阵,是否会改变你对答案的看法? – judeclarke 2011-12-31 03:32:41