繁体   English   中英

矩阵平移分量的旋转

[英]Rotation of the translational component of a Matrix

使用android.graphics.Matrix库:

Matrix foo = new Matrix();

foo.setTranslate(10.0f, 0.0f);
Log.d("MatrixTest", foo.toString());

foo.postRotate(30.0f, 0.0f, 0.0f);
Log.d("MatrixTest", foo.toString());

我得到以下输出:

foo = {[1.0, 0.0, 10.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}
foo = {[0.8660254, -0.5, 8.660254][0.5, 0.8660254, 5.0][0.0, 0.0, 1.0]}

这正是我所期望的。

现在,对于我的应用程序来说,它也可以在桌面上运行很有用,因此我正在移植到libgdx。

使用com.badlogic.gdx.math.Matrix3库:

Matrix3 bar = new Matrix3();

bar.translate(10.0f, 0.0f);
System.out.println(bar.toString());

bar.rotate(30.0f);
System.out.println(bar.toString());

我得到以下输出:

bar = [1.0|0.0|10.0] [0.0|1.0|0.0] [0.0|0.0|1.0]
bar = [0.8660254|-0.5|10.0] [0.5|0.8660254|0.0] [0.0|0.0|1.0]

在这种情况下,X的平移分量尚未旋转。

这是正确的行为吗? android postRotate()方法和libgdx rotation()方法的API均将它们描述为旋转后函数。

对于libgdx Matrix4,我得到了类似的结果,这是我实际上要使用的结果。

有人可以建议一种很好的方法来重现使用libgdx Matrix3或4从android库获得的结果吗?

只是为了让事情变得清楚...

如果仅坚持矩阵乘法,然后尝试使用便捷方法来对矩阵本身进行运算,那么这是最不明确的。

在大多数情况下,当对矩阵执行诸如translate之类的操作时,将创建一个转换矩阵,并将原始矩阵与新矩阵相乘,即originalMatrix*translationMatrix 这就是第二个示例中发生的情况。 您的第一个示例带有一个前缀“ post”,它似乎在执行反向操作translationMatrix*originalMatrix

我可以理解,此“帖子”可能有用,并且对矩阵运算不是很熟悉的人可能会更自然地使用它。 我不明白的是“ postMultiply”。 这根本不是它的工作方式,也不是矩阵乘法的使用方式,只会使大多数开发人员感到困惑。 不仅在学习过程中,即使以后有人也会阅读此代码。 当然可以,但是对我来说,这与编写如下代码相同:

打印前N整数值:

    for(int i=N; i>0; --i)
    {
        int printValue = N-i+1;
        // print the printValue
    }

当然可以,但是对我来说,这是完全不可读的。

无论如何,如果您在想像矩阵乘法时遇到困难,都应该考虑一下它,就好像您是第一人称它一样。 例如,沿X轴平移将意味着向前迈步,向Y左移而Z向上。 这样,旋转只会围绕您的中心,而不会影响您的位置。

因此,在第一个示例中,您首先向左旋转30度,现在正对着点(0.8660254, 0.5) 然后沿X轴平移10,这意味着向前移动10点,您的位置变为(0.8660254, 0.5)*10.0因此最终以(8.660254, 5.0)朝向(8.660254 + 0.8660254, 5.0 + 0.5)

在第二个示例中,您首先沿X轴平移10个点,这意味着向前移动10个以(10, 0)结束但仍朝向相同方向的点,然后向左旋转30度并简单地在相同位置结束在(10.0, .0)朝向(10.0+0.8660254, .0+.5)

正如您现在可能从结果中看到的那样,正在获取矩阵中的列(而不是案例中的行)来定义矩阵基向量。 因此,仅从这些向量中,您就可以了解对象面向的方向以及中心的位置。 您也可以简单地从这些向量构造一个矩阵。 如果要为位于位置P且面向D方向的对象创建矩阵,则该矩阵为:

D.x, D.y, .0
-D.y, D.x, .0
P.x, P.y, 1.0

在你的情况下换位

D.x, -D.y, P.x
D.y, D.x, P.y
.0, .0, 1.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM