【问题标题】:How do I rotate in object space in 3D (using Matrixes)如何在 3D 对象空间中旋转(使用矩阵)
【发布时间】:2012-03-29 20:38:18
【问题描述】:

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

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

【问题讨论】:

  • 您想围绕任意轴或坐标轴之一旋转对象吗?
  • 一般3D问题的答案是here

标签: matrix 3d rotation point


【解决方案1】:

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

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

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

【讨论】:

  • 我的问题是我需要保持我的对象旋转,同时仍将其转移到世界空间,想象我在说什么,想想对象空间中的一个向量,在对象空间中旋转,关于一个特定的方向,我需要保持特定的方向,但也需要旋转到世界空间,如果我让它有点清楚,或者你是说将我的旋转矩阵乘以对象空间,然后将它乘回到世界空间?那样有用吗?抱歉,如果我处理这个问题的方式听起来有点傻,我对矩阵数学还是有点陌生​​。你能写一个小例子吗?谢谢
  • 您是否希望您的对象在世界空间中保持相同的方向,而不管任何关节决定其位置?如果是这样,您可以在世界空间中找到这个基本位置(通过使用现有的OLD_MODEL 矩阵转换单个顶点),并创建一个全新的MODEL 矩阵,它只是对那个点的转换。
  • 不需要 4x4 矩阵,因为我自己处理位置,也不需要倾斜,但是您之前所说的关于对象旋转的内容,您是说我应该这样做( RotationMatrixmodel) 而不是 (modelRotationMatrix) 通常用于惯性旋转?还是我还是误会了。你能写一个我可以看的小代码示例,看看你的意思,并适用于我的情况,因为这将是最有帮助的:)
  • 最后,即使你不想这样做:如果你想在对象空间中旋转你的对象,显而易见的做法是将它乘以一个旋转矩阵 before 做你想做的所有其他转换。
  • 或者,等效地:通过计算矩阵 RandT= Robj * T 并使用 RandT 而不是 @987654338,将您的矩阵 Robj 与您将在 p 上完成的转换 T 结合起来@.
猜你喜欢
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多