我正在尝试围绕全局轴在3D中旋转对象,我有问题,它不会围绕原点旋转。 尝试以下
float3 middle = //calculated the center of the cuboit
mymesh.setTransform(mymesh.getTransform()
* Matrix::createTranslation(middle)
* Matrix::createRotationY(-time * speed)
* Matrix::createTranslation(middle).invert());
对于围绕局部轴的旋转,这非常适用。 如果我围绕y轴旋转它只是一切都很好。如果我围绕x轴旋转它,那么围绕y轴的旋转是局部的,它不会再旋转对象全局。
我已经读过,它在我的旋转矩阵的哪一侧很重要我乘以代表3D对象的矩阵。 如果我希望它围绕局部轴旋转,那么我将它乘以左侧。
Result = M * rotation
结果是旋转后的矩阵M. 如果我希望它绕全局轴旋转,那么我将它乘以右侧:
Result = rotation * M
现在这个工作正在进行,期望翻译不再有效。它不是围绕原点旋转,而是感觉它绕着cuboit外点的中心旋转。 我的计算是:
Matrix m = Matrix::createTranslation(middle)
* Matrix::createRotationY(-time * speed)
* Matrix::createTranslation((-1.0)* middle);
mymesh.setTransform(m * mymesh.getTransform());
我想的越多,我理解的越少。现在我甚至质疑,为什么围绕局部轴旋转的第一个实现工作。
变量middle根据cubiot的大小计算,并代表它的中心。
我们可以说它是p1(1,1,1)
如果我在z轴上像3D一样移动我的对象,那么我的对象就在p2(0,0,10)
处。但是,如果我将对象移回-p1
,将其旋转并向后移动,而不是我的对象仍然不在原点,但它会像原点一样旋转。
似乎我不明白重要的事情。如何围绕全局轴旋转并像原点一样旋转它?为什么第一个实现工作?
编辑: Matrix是一个表示网格的4x4矩阵,float3是x,y,z协调系统的一个点
EDIT2: 好的问题的解决方案似乎是计算所做的转换。如果我知道用于平移的Vector,那么我可以将对象移回原点,旋转它并将其移回原位。 我试图通过向每个运动添加向量来跟踪对象的中心,但是当我更改对象的形式时,中心是错误的。 有没有办法计算从对象中进行的转换? 就像我将它在x轴10上向右移动而不是旋转它。中心不会改变位置,但只从矩阵中转换将返回错误的值。