|

楼主 |
发表于 2007-6-9 21:25:00
|
显示全部楼层
Re:[源代码]我边学DX边写的一个小引擎```现在遇到问题了,
好了,问题已经解决。一直在考虑变换````变换的先后顺序啊`````变换的组合啊``````试图找出一个最自然和最简洁的方法`````没想到反而使自己陷入了迷糊之中````从而忽视了问题的一些细节``````刚才突然发现原来是少旋转了一个从 父节点 指向 子节点 的向量,好了,修改的代码如下,只需改一个函数,红色部分为增加的代码:
void DiamondNode::OnParentRotation( const D3DXMATRIX* rotationMatrix )
{
float parentX, parentY, parentZ;
m_parent->GetPosition( &parentX, &parentY, &parentZ );
D3DXVECTOR3 toParent( m_matrix->_41 - parentX, m_matrix->_42 - parentY, m_matrix->_43 - parentZ );
D3DXVECTOR3 right( m_matrix->_11, m_matrix->_12, m_matrix->_13 );
D3DXVECTOR3 up( m_matrix->_21, m_matrix->_22, m_matrix->_23 );
D3DXVECTOR3 forward( m_matrix->_31, m_matrix->_32, m_matrix->_33 );
D3DXVec3TransformCoord( &toParent, &toParent, rotationMatrix );
D3DXVec3TransformCoord( &right, &right, rotationMatrix );
D3DXVec3TransformCoord( &up, &up, rotationMatrix );
D3DXVec3TransformCoord( &forward, &forward, rotationMatrix );
m_matrix->_11 = right.x;
m_matrix->_12 = right.y;
m_matrix->_13 = right.z;
m_matrix->_21 = up.x;
m_matrix->_22 = up.y;
m_matrix->_23 = up.z;
m_matrix->_31 = forward.x;
m_matrix->_32 = forward.y;
m_matrix->_33 = forward.z;
m_matrix->_41 = parentX + toParent.x;
m_matrix->_42 = parentY + toParent.y;
m_matrix->_43 = parentZ + toParent.z;
for ( *m_iterator = m_child->begin(); *m_iterator != m_child->end(); (*m_iterator)++ )
{
if ( (*(*m_iterator)) != NULL )
(*(*m_iterator))->OnParentRotation( rotationMatrix );
}
ApplyMatrix();
} |
|