如何在3D中旋转对象空间(使用矩阵)

时间:2012-03-29 20:38:18

标签: matrix 3d rotation point

我要做的是设置可以执行全局和对象空间旋转的函数,但是在理解如何进行对象空间旋转时遇到问题,因为只需将一个点乘以旋转仅适用于全局空间,所以我的想法是在对象空间中构建旋转,然后将它乘以对象矩阵的倒数,据说可以消除对象和全局空间之间的所有多余旋转,因此仍然保持对象空间旋转,但在全局值中,我在这个逻辑中是错误的,因为它不起作用,这是我的代码,如果你想检查它,它调用的所有函数都已经过测试工作:

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

1 个答案:

答案 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围绕对象空间的中心旋转。