无法从不是原点的其他地方旋转对象
Can't rotate object from other place that isn't origin point
我知道尽可能简单的方法是使用:
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)
的操作时,我仍然让对象从左上角旋转。
还有,应该是objective在旋转前将物体移动到原点,旋转矩阵无论我改变它都没有效果,并且矩阵的第4列没有乘以旋转矩阵的任何方式,只是放在它之前的位置...
添加平移矩阵的元素不等同于乘以相应的平移矩阵,后者是应用平移的正确方法。
说明
[旋转矩阵R
,平移偏移t
- 矩阵T
,模型点p
。]
直接加上平移矩阵T
相当于预乘,也就是在输出点上加上偏移量:
p --> R*p + t
( = T*R*p )
所以最后一点是:
p' = R*p - t + t = R*p
( = T*inv(T)*R )
平移矩阵及其逆矩阵(偏移 -t
)相互抵消,剩下一个关于原点的有效旋转。
另一方面,post-乘以与翻译矩阵等价于预应用翻译:
p --> R*(p - t)
( = R*inv(T)*p )
所以正确的最后一点是:
p' = R*(p - t) + t
( = T*R*inv(T)*p )
请注意,有效偏移量不会抵消,因为 T
和 inv(T)
在表达式中彼此不相邻。
正确代码
model_final = tempModel1 * model * tempModel2;
// T * R * inv(T)
(或使用您的库中的任何一个函数以上述 "conventional" 方式乘以矩阵)
我知道尽可能简单的方法是使用:
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)
的操作时,我仍然让对象从左上角旋转。
还有,应该是objective在旋转前将物体移动到原点,旋转矩阵无论我改变它都没有效果,并且矩阵的第4列没有乘以旋转矩阵的任何方式,只是放在它之前的位置...
添加平移矩阵的元素不等同于乘以相应的平移矩阵,后者是应用平移的正确方法。
说明
[旋转矩阵R
,平移偏移t
- 矩阵T
,模型点p
。]
直接加上平移矩阵T
相当于预乘,也就是在输出点上加上偏移量:
p --> R*p + t
( = T*R*p )
所以最后一点是:
p' = R*p - t + t = R*p
( = T*inv(T)*R )
平移矩阵及其逆矩阵(偏移 -t
)相互抵消,剩下一个关于原点的有效旋转。
另一方面,post-乘以与翻译矩阵等价于预应用翻译:
p --> R*(p - t)
( = R*inv(T)*p )
所以正确的最后一点是:
p' = R*(p - t) + t
( = T*R*inv(T)*p )
请注意,有效偏移量不会抵消,因为 T
和 inv(T)
在表达式中彼此不相邻。
正确代码
model_final = tempModel1 * model * tempModel2;
// T * R * inv(T)
(或使用您的库中的任何一个函数以上述 "conventional" 方式乘以矩阵)