我正在在OpenGL ES的Android项目中的使用加速度计来计算具体的轴变化,我的目标是我的旋转飞船状物体的运动矢量。 问题是,我无法理解旋转矩阵背后的数学。 缺省运动矢量是0,1,0,装置+ Y,所以对象看起来向上在开始。 我试图转动它的运动矢量,所以我可以移动它指向的对象。 我可以在手机收集旋转的变化。 x轴:旋转[0],y轴:旋转[1],Z轴:旋转[2]。 我如何可以旋转使用旋转矩阵我的运动矢量?
Answer 1:
如果你想旋转你应该建立什么是所谓的矢量旋转矩阵 。
旋转2D
假设你要旋转矢量或θ点,然后三角指出,新坐标
x' = x cos θ − y sin θ
y' = x sin θ + y cos θ
为了演示这一点,让我们的基数X和Y轴; 当我们旋转X轴逆时针90°,我们应该结束了变换为Y轴方向的X轴。 考虑
Unit vector along X axis = <1, 0>
x' = 1 cos 90 − 0 sin 90 = 0
y' = 1 sin 90 + 0 cos 90 = 1
New coordinates of the vector, <x', y'> = <0, 1> ⟹ Y-axis
当你明白这一点,创建一个矩阵来做到这一点就变得简单了。 矩阵仅仅是在一个舒适的,广义的方式执行此操作,以便像旋转,缩放和平移(移动)各种变换可以组合并在单个步骤中,使用一种普通的方法进行的数学工具。 从线性代数,旋转在2D点或向量,要构建的矩阵是
|cos θ −sin θ| |x| = |x cos θ − y sin θ| = |x'|
|sin θ cos θ| |y| |x sin θ + y cos θ| |y'|
旋转3D
这一工程在2D,而在3D领域,我们需要采取在考虑到第三轴。 旋转围绕原点(点)在2D只是意味着在周围3D Z轴(线)使其旋转的载体; 由于我们围绕Z轴旋转,其坐标应保持恒定,即0°(旋转发生在XY平面上在3D)。 在3D绕Z轴旋转。将
|cos θ −sin θ 0| |x| |x cos θ − y sin θ| |x'|
|sin θ cos θ 0| |y| = |x sin θ + y cos θ| = |y'|
| 0 0 1| |z| | z | |z'|
绕Y轴会
| cos θ 0 sin θ| |x| | x cos θ + z sin θ| |x'|
| 0 1 0| |y| = | y | = |y'|
|−sin θ 0 cos θ| |z| |−x sin θ + z cos θ| |z'|
绕X轴将是
|1 0 0| |x| | x | |x'|
|0 cos θ −sin θ| |y| = |y cos θ − z sin θ| = |y'|
|0 sin θ cos θ| |z| |y sin θ + z cos θ| |z'|
注意 :轴围绕其旋转完成具有在基质中没有正弦或余弦元件。 我希望这是旋转壳体清晰。
组成
上述矩阵旋转对象,就像对象是在从原点的距离r =√(X 2 Y 2 +); 查找极坐标知道为什么。 这种旋转将是相对于世界空间的原点。 通常我们需要绕其自身的帧/支点,而不是全世界的旋转对象。 因为不是所有的对象都是在世界坐标系原点,用这些矩阵不会给周围的物体本身的框架旋转的期望的结果旋转。 因此,你需要了解的翻译了。 你首先翻译(移动)对象世界原点(使对象的起源将与世界接轨,从而使R = 0),与这些矩阵的一个(或多个)进行旋转,然后再翻译回它以前的位置。 的顺序,其中所述变换是施加的事项 。
我希望你了解线性和仿射变换及其对一次性执行多个转换组成,在代码转换前打。 如果不了解它背后的数学基础,调试转变将是一场噩梦。 我发现这个讲座视频是一个非常好的资源。 另一个资源是本教程的转变 ,旨在直观,说明了动画的想法。
注意:在执行转速此方法如下所述欧拉角旋转系统,这是更简单的教导和掌握。 这对于2D和3D简单案件工作完全正常; 但是,当旋转需要被同时则欧拉角不足以此所有三个轴周围进行由于在本系统中,其本身表现为一个固有缺陷万向锁 。 人们诉诸四元数 S IN这种情况下,这是比这更先进的,但正确使用时不会从万向锁受苦。
Answer 2:
这里引用文档: http://developer.android.com/reference/android/opengl/Matrix.html
- 建立一个旋转矩阵
- 变换向量与矩阵
你并不需要了解数学,库函数会完成这项工作。