|
ogre中处理节点有这么一段代码:
void Node::updateFromParentImpl(void) const
{
if (mParent)
{
// Update orientation
const Quaternion& parentOrientation = mParent->_getDerivedOrientation();
if (mInheritOrientation)
{
// Combine orientation with that of parent
mDerivedOrientation = parentOrientation * mOrientation;
}
else
{
// No inheritence
mDerivedOrientation = mOrientation;
}
// Update scale
const Vector3& parentScale = mParent->_getDerivedScale();
if (mInheritScale)
{
// Scale own position by parent scale, NB just combine
// as equivalent axes, no shearing
mDerivedScale = parentScale * mScale;
}
else
{
// No inheritence
mDerivedScale = mScale;
}
// Change position vector based on parent's orientation & scale
mDerivedPosition = parentOrientation * (parentScale * mPosition);
// Add altered position vector to parents
mDerivedPosition += mParent->_getDerivedPosition();
}
else
{
// Root node, no parent
mDerivedOrientation = mOrientation;
mDerivedPosition = mPosition;
mDerivedScale = mScale;
}
mCachedTransformOutOfDate = true;
mNeedParentUpdate = false;
}
这段处理父子节点关系的函数,有点想不明白的地方。在不考虑有transform的情况下,子节点的坐标不应该是RotateParent * ScaleParent * RotateChild * ScaleChild,应该是这样一层层下来吧。可是上面的代码的处理方法就变成了RotateParent * RotateChild * ScaleParent * ScaleChild了。旋转和缩放矩阵为什么可以拆分开来单独叠加再相乘,矩阵乘法不能换顺序吧,还是小弟有什么理解出错的地方,请大侠们指点啊 |
|