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

Matrix 如何在三维对象空间中旋转(使用矩阵),matrix,3d,rotation,point,Matrix,3d,Rotation,Point,我想做的是设置可以执行全局和对象空间旋转的函数,但是我在理解如何进行对象空间旋转时遇到了问题,因为将一个点乘以旋转只适用于全局空间,所以我的想法是在对象空间中构建旋转,然后将其乘以对象矩阵的倒数,假设去除了对象和全局空间之间所有多余的旋转,因此仍然保持对象空间旋转,但在全局值中,我在这个逻辑中是错误的,因为它不起作用,这是我的代码,如果你想检查它,它调用的所有函数都已测试过工作: // build object space rotation sf::Vector3<float> XM

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

// 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);
//构建对象空间旋转
向量3矩阵(多重矩阵(sf::向量3(cosz,sinz,0));
sf::vector3ymatrix(MultiplyByMatrix(sf::Vector3(-sinz,cosz,0));
sf::Vector3 z矩阵(多重矩阵(sf::Vector3(0,0,1));
//构建辅因子矩阵
sf::Vector3逆矩阵[3];
辅因子(逆矩阵);
//乘以辅因子矩阵(伴随)的转置,将旋转带到世界空间坐标
sf::Vector3 RelativeXMatrix=多重传输(X矩阵,逆矩阵[0],逆矩阵[1],逆矩阵[2]);
sf::Vector3 RelativeYMatrix=多重传输(YMatrix,InverseMatrix[0],InverseMatrix[1],InverseMatrix[2]);
sf::Vector3 RelativeZMatrix=多重传输(ZMatrix,InverseMatrix[0],InverseMatrix[1],InverseMatrix[2]);
//从世界空间执行旋转
PointsPlusMatrix(RelativeX矩阵、RelativeY矩阵、RelativeZ矩阵);

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

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

  • 从对象空间(乘以要变换的矩阵)
  • 进入世界空间,(然后乘以
    视图
    矩阵进行变换)
  • 进入相机空间,(然后乘以投影矩阵进行变换)
  • 到投影空间或“剪辑”空间
具体来说,假设点表示为列向量;然后,通过左乘以变换矩阵来变换点:

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 = STAGE_2_WORLD * BODY_2_STAGE *
  SHOULDER_2_BODY * UPPERARM_2_SHOULDER *
  FOREARM_2_UPPERARM * HAND_2_FOREARM
因此,您是在模型空间中旋转还是在世界空间中旋转取决于应用旋转矩阵的
模型
矩阵的哪一侧。当然,您可以轻松做到这两个方面:

MODEL = WORLD_ROTATION * OLD_MODEL * OBJECT_ROTATION

在这种情况下,
WORLD\u ROTATION
围绕世界空间的中心旋转,而
OBJECT\u ROTATION
围绕对象空间的中心旋转。

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

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

  • 从对象空间(乘以要变换的矩阵)
  • 进入世界空间,(然后乘以
    视图
    矩阵进行变换)
  • 进入相机空间,(然后乘以投影矩阵进行变换)
  • 到投影空间或“剪辑”空间
具体来说,假设点表示为列向量;然后,通过左乘以变换矩阵来变换点:

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 = STAGE_2_WORLD * BODY_2_STAGE *
  SHOULDER_2_BODY * UPPERARM_2_SHOULDER *
  FOREARM_2_UPPERARM * HAND_2_FOREARM
因此,您是在模型空间中旋转还是在世界空间中旋转取决于应用旋转矩阵的
模型
矩阵的哪一侧。当然,您可以轻松做到这两个方面:

MODEL = WORLD_ROTATION * OLD_MODEL * OBJECT_ROTATION

在这种情况下,
世界旋转
围绕世界空间的中心旋转,而
对象旋转
围绕对象空间的中心旋转。

是否要围绕任意轴或一个坐标轴旋转对象?一般3D问题的答案是。是否要围绕任意轴或一个坐标轴旋转对象?一般3D问题的答案是。我的问题是我需要保持我的物体旋转,同时仍然将其转移到世界空间,想象我在说什么,想象物体空间中的一个向量,在物体空间中旋转,关于一个特定的方向,我需要保持特定的方向,但也旋转到世界空间中,如果我说得有点清楚的话,或者你是说把我的旋转矩阵乘以物体空间,然后再乘以世界空间?这样行吗?抱歉,如果我的工作方式听起来有点傻,我对矩阵数学还是有点陌生。你能写一个小例子吗?谢谢你想让你的面向对象在世界空间中保持同一个方向,不管它的位置是由什么发音决定的吗?如果是这样,您可以在世界空间中找到这个基本位置(通过使用现有的
旧模型
矩阵变换单个顶点),并创建一个全新的
模型
矩阵,它只是到该点的一个平移。不需要4x4矩阵,就像我自己的位置处理一样,也不需要倾斜,但是你之前说的关于物体旋转,你是说我应该做(旋转矩阵模型)而不是(模型旋转矩阵)像惯性旋转一样?还是我还是误会了。你能不能写一个小的代码样本,让我看看,看看你的意思,并应用到我的环境中,因为这将是最有帮助的:)最后,即使你不想这样做:如果你想在对象空间中旋转你的对象,最明显的做法是用旋转矩阵b乘以它