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



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

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

世界空间和对象空间中的旋转之间的区别在于应用旋转矩阵的位置。

计算机图形学使用矩阵的常用方法是映射顶点:

  • 从对象空间,(乘以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绕对象空间中心旋转。

最新更新