Search code examples
c++mathdirectxgame-physics

Is this how you correctly calculate a Vector3 Transform and TransformCoordinate?


I have been looking into how the D3DXVec3Transform and D3DXVec3TransformCoord functions are operating was wondering if this is the correct way the math should be, if not, could someone please explain why. I understand that there are already DirectX functions to do this, however, I have been attempting to learn more about the math behind the scenes and from research I have come to this.

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);
}

Solution

  • From looking at similar functions in the D3DX Library it seems you have implemented their function faithfully.

    It may also help to have a function which transforms (x,y,z,0) by a 4x4 matrix as this is useful when translating directions, such as an object's velocity or a surface's normal. The vector will be transformed without translations being applied, which would have ruined the direction.