2011-12-30 4 views
0

Я изучал, как работают функции D3DXVec3Transform и D3DXVec3TransformCoord, задаваясь вопросом, правильно ли это математика, если нет, может кто-то объяснить, почему. Я понимаю, что для этого уже есть функции DirectX, однако я пытаюсь узнать больше о математике за кулисами и от исследований, к которым я пришел.Правильно ли вы вычисляете преобразование Vector3 и 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