我要做的是设置可以执行全局和对象空间旋转的函数,但是在理解如何进行对象空间旋转时遇到问题,因为只需将一个点乘以旋转仅适用于全局空间,所以我的想法是在对象空间中构建旋转,然后将它乘以对象矩阵的倒数,据说可以消除对象和全局空间之间的所有多余旋转,因此仍然保持对象空间旋转,但在全局值中,我在这个逻辑中是错误的,因为它不起作用,这是我的代码,如果你想检查它,它调用的所有函数都已经过测试工作:
// build object space rotation
sf::Vector3<float> XMatrix (MultiplyByMatrix(sf::Vector3<float> (cosz,sinz,0)));
sf::Vector3<float> YMatrix (MultiplyByMatrix(sf::Vector3<float> (-sinz,cosz,0)));
sf::Vector3<float> ZMatrix (MultiplyByMatrix(sf::Vector3<float> (0,0,1)));
// build cofactor matrix
sf::Vector3<float> InverseMatrix[3];
CoFactor(InverseMatrix);
// multiply by the transpose of the cofactor matrix(the adjoint), to bring the rotation to world space coordinates
sf::Vector3<float> RelativeXMatrix = MultiplyByTranspose(XMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);
sf::Vector3<float> RelativeYMatrix = MultiplyByTranspose(YMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);
sf::Vector3<float> RelativeZMatrix = MultiplyByTranspose(ZMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);
// perform the rotation from world space
PointsPlusMatrix(RelativeXMatrix, RelativeYMatrix, RelativeZMatrix);
答案 0 :(得分:3)
世界空间和物体空间中的旋转之间的差异是应用旋转矩阵的位置。
计算机图形使用矩阵的常用方法是映射顶点:
MODEL
矩阵进行转换)VIEW
矩阵进行变换)PROJECTION
矩阵进行转换)具体地说,假设点表示为列向量;然后,你通过左边乘以变换矩阵来变换一个点:
world_point = MODEL * model_point
camera_point = VIEW * world_point = (VIEW*MODEL) * model_point
clip_point = PROJECTION * camera_point = (PROJECTION*VIEW*MODEL) * model_point
这些变换矩阵中的每一个本身可能是多个矩阵按顺序相乘的结果。特别是,MODEL
矩阵通常由一系列旋转,平移和缩放组成,基于分层铰接模型,例如:
MODEL = STAGE_2_WORLD * BODY_2_STAGE *
SHOULDER_2_BODY * UPPERARM_2_SHOULDER *
FOREARM_2_UPPERARM * HAND_2_FOREARM
因此,无论您是在模型空间还是世界空间中旋转,都取决于您应用旋转矩阵的MODEL
矩阵的哪一侧。当然,你可以很容易地做到这两点:
MODEL = WORLD_ROTATION * OLD_MODEL * OBJECT_ROTATION
在这种情况下,WORLD_ROTATION
围绕世界空间的中心旋转,而OBJECT_ROTATION
围绕对象空间的中心旋转。