我在opengl中制作了一个Android项目,它使用加速计来计算特定轴的变化,我的目标是旋转我的类似航天器的物体的运动矢量。问题是我无法理解旋转矩阵背后的数学。默认运动矢量为0,1,0,表示+ y,因此对象在开头向上看。而我正在尝试旋转它的运动矢量,这样我就可以移动它所指向的物体。我可以在手机中收集旋转变化。 x轴:旋转[0],y轴:旋转[1],z轴:旋转[2]。如何使用旋转矩阵旋转运动矢量?
答案 0 :(得分:124)
如果要旋转矢量,则应构建所谓的rotation matrix。
假设您想要将矢量或点旋转θ,然后trigonometry表示新坐标为
x' = x cos θ − y sin θ
y' = x sin θ + y cos θ
为了演示这个,让我们取主要轴X和Y;当我们将X轴逆时针旋转90°时,我们应该将X轴转换为Y轴。考虑
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'|
这适用于2D,而在3D中我们需要考虑第三轴。在2D中围绕原点(点)旋转矢量仅仅意味着围绕Z轴(一条线)以3D旋转;因为我们围绕Z轴旋转,所以它的坐标应该保持不变,即0°(旋转发生在3D平面上的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²+y²);查找polar coordinates以了解原因。这种旋转将相对于世界空间起源。通常我们需要围绕自己的框架/枢轴旋转对象,而不是围绕世界。由于并非所有对象都处于世界原点,因此使用这些矩阵旋转将不会产生围绕对象自身框架旋转的所需结果。因此,您还需要了解translation。您首先将对象转换(移动)到世界原点(以便对象的原点与世界对齐,从而使r = 0),使用这些矩阵中的一个(或多个)执行旋转,然后再将其转换回来到它以前的位置。转换的顺序matters。
我恳请您阅读有关线性和仿射变换及其组合的内容,以便在使用代码转换之前一次执行多次转换。如果不了解它背后的基本数学,调试转换将是一场噩梦。我发现this lecture video是一个非常好的资源。另一个资源是this tutorial on transformations,旨在直观并用动画说明想法。
注意:这种执行旋转的方法遵循Euler angle旋转系统,该系统更易于教导和掌握。这适用于2D和简单3D情况;但是当需要同时围绕所有三个轴进行旋转时,由于该系统的固有缺陷表现为Gimbal lock,因此欧拉角是不够的。在这种情况下,人们诉诸Quaternion,这比这更先进,但如果使用正确,不会受到万向节锁的影响。
答案 1 :(得分:0)
参考文档:http://developer.android.com/reference/android/opengl/Matrix.html
您不需要了解数学,库函数将完成工作。
答案 2 :(得分:0)
我推断向量的 X 分量应该是 M*cos(o)cos(t)+x, Y 分量应为 Mcos(t)sin(o)+y,z 分量应为 Mcos(o)*sin(t)+z 其中 M 是向量,o是垂直平面的旋转角度,t是水平平面的旋转角度,x是旋转中心的x值,y是旋转中心的y值,z是z值的旋转中心。请告诉我这是否适合您。