无法从非原点的其他位置旋转对象



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

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)之类的事情时,我会从左上角旋转对象。

另外,应该在旋转之前将对象移至原点的目的,旋转矩阵没有效果,我将其更改,并且矩阵的第四列与旋转矩阵无乘以任何方式,只是放置在之前的位置...

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


解释

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

直接添加翻译矩阵T等于 pre-multiplying ,这意味着将偏移添加到输出点:

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)

(或使用图书馆的函数之一,以上述"常规"方式乘以矩阵)

最新更新