关于globalm轴的

时间:2017-03-11 14:46:05

标签: c++ matrix 3d rotation translation

我正在尝试围绕全局轴在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上向右移动而不是旋转它。中心不会改变位置,但只从矩阵中转换将返回错误的值。

0 个答案:

没有答案