C++ 如何将所有对象按其自身中心旋转,然后将其平移到实际位置(这不起作用)

C++ 如何将所有对象按其自身中心旋转,然后将其平移到实际位置(这不起作用),c++,opengl,rotation,center,glm-math,C++,Opengl,Rotation,Center,Glm Math,如何使所有未与原点中心(矢量3(0.0f,0.0f,0.0f))对齐的对象绕其自身的中心轴旋转 伪代码中的问题: vector3 vector3 objectCenter = (10,5,0); // current object center vector3 vector3 objectPosition = (40,5,0); // Place to translate the object vector3 objectRotation; = 45.0f; matrix.loadId

如何使所有未与原点中心(矢量3(0.0f,0.0f,0.0f))对齐的对象绕其自身的中心轴旋转

伪代码中的问题:

vector3 vector3 objectCenter = (10,5,0); // current object center
vector3 vector3 objectPosition = (40,5,0); // Place to translate the object
vector3 objectRotation; = 45.0f;

    matrix.loadIdentity ();
    matrix.translate (objectCenter);

    //apply transformations
    matrix.rotateX (objectRotation);

    matrix.translate (-objectCenter);

    //itś work correctly until here
    //when i try to translate the object to the real position, the rotation is incorrect.

    matrix.translate (objectPosition);

我使用C++、GLM(矩阵管理)和OpenGL.< /P> < P>如果您想在本地将对象旋转到它自己的坐标系,那么这样做:< /P>

M=inverse(inverse(M)*rotation_matrix);
  • M
    是对象变换矩阵
  • rotation\u矩阵
    是任何旋转(
    glRotate()
  • inverse
    是计算逆矩阵的函数,您可以使用我的或这个
[edit1]关于M和它所代表的坐标系的对象之间关系的更多信息

看这里:

M
原点通常是对象的中间(或旋转运动的中心点)。
M
的轴通常与对象对齐,例如在飞机上,
X
轴通常是飞行方向。我更习惯于:

  • +z
    轴作为前进方向移动
  • +x
    为右,-x为左
  • +y
    表示向上,而-y表示向下

pith、yaw、roll
是物体围绕
x、y、z的局部旋转

为什么一半是缩进的?这是你的实际代码吗?什么类型的“矩阵”?我认为问题是您应该指定matrix=matrix.translate(…)或matrix.rotateX(…)。但我们不能知道,直到你告诉我们它是什么类型。假设它是glm mat4,我认为这实际上就是问题所在。@Calpratt我假设它是为了区分变量去虚化/初始化与算法。@user2303826最常见的方法是执行一个转换,将对象置于
(0,0,0)
的中心,执行旋转,然后反转对象的平移,将其放回原处。更复杂(但计算时间更短)的方法是仅使用位置向量修改旋转变换。我现在完全忘了怎么做(所以不作为答案发布),但是一本半体面的几何教科书会列出方法。矩阵类,只是一个glm接口,这是正确的实例。matrix类工作正常,问题只存在于相对于原点不居中的对象。非常感谢Spektre,还有一个问题,当你提到“M”(对象的变换矩阵)时,你的意思是“M”应该应用平移、缩放和旋转变换吗?@user2303826添加了edit1来回答。我不使用每个帧/对象的glTranslate、glRotate序列,而是为每个对象累积变换M,如果我想移动它,那么我将向其原点添加方向向量*步长一次如果我想旋转,那么我将旋转它一次…@user2303826,但这样我必须偶尔确保正交性,以避免精度降低,所以我取Z轴,使其长度等于1,然后计算x,Z->y和y,Z->x之间的叉积。。。也让它们成为单位向量。。。这样,z轴与was和x、y轴相同(矿井主轴),因此它们相互垂直