不能从非原点的其他地方旋转物体

问题描述 投票:0回答:1

我知道尽可能简单的假设方法是使用:

glTranslate(a,b,c);
glRotate(...);
glTranslate(-a,-b,-c);

但在这种情况下,我使用缓冲区来使事情变得更加清晰和快速,事情就是我正在做的事情是:

iMat4x4 tempModel;
iMat4x4 tempModel2;


tempModel = math::translate(tempModel, iVec3(0.5f * size.x, 0.5f * size.y, 0.0f));
model[3].z = model[3].w = 0;
model[3] = model[3] + tempModel[3];

model = math::rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));

tempModel2 = math::translate(tempModel2, iVec3(-0.5f * size.x, -0.5f * size.y, 0.0f));
model[3].z = model[3].w = 0;
model[3] = model[3] + tempModel2[3];

但是,当我做像object->rotation = sin(Time::WorldTime)这样的事情时,我会从左上角旋转物体。

另外,在旋转之前将物体移动到原点的目的应该是什么,旋转矩阵没有影响我改变它,并且矩阵的第4列不会以任何方式与旋转矩阵相乘,只是放置之前的地方......

c++ opengl math 3d glm-math
1个回答
1
投票

添加平移矩阵的元素不等于乘以相应的平移矩阵,后者是应用平移的正确方法。


说明

[旋转矩阵R,平移偏移t - 矩阵T,模型点p。]

直接添加平移矩阵T相当于预乘它,这意味着偏移量被添加到输出点:

p --> R*p + t
  ( = T*R*p )

所以最后一点是:

p' = R*p - t + t = R*p
 ( = T*inv(T)*R )

平移矩阵及其倒数(由-t偏移)相互抵消,并且您可以在原点周围进行有效的旋转。

另一方面,翻译矩阵后乘相当于预先应用翻译:

p --> R*(p - t)
  ( = R*inv(T)*p )

所以正确的最后一点是:

p' = R*(p - t) + t
 ( = T*R*inv(T)*p )

请注意,有效偏移不会抵消,因为Tinv(T)在表达式中不是彼此相邻的。


正确的代码

model_final = tempModel1 * model * tempModel2;
            //    T      *   R   *   inv(T)

(或者使用您的库函数中的任何一个函数,以上述“常规”方式乘以矩阵)

© www.soinside.com 2019 - 2024. All rights reserved.