在3D空间中旋转矢量
我在opengl es中制作了一个android项目,它使用加速度计计算特定坐标轴的变化,我的目标是旋转我类似于飞船的物体的运动矢量。 问题是我无法理解旋转矩阵背后的数学。 默认移动向量是0,1,0,意味着+ y,所以对象在开始时向上看。 我试图旋转它的运动矢量,所以我可以移动它指向的对象。 我可以在手机中收集轮换更改。 x轴:旋转[0],y轴:旋转[1],z轴:旋转[2]。 我如何使用旋转矩阵来旋转我的运动矢量?
如果你想旋转一个矢量,你应该构造一个所谓的旋转矩阵。
2D旋转
假设你想通过θ旋转一个矢量或一个点,那么三角函数表明新的坐标是
x' = x cos θ − y sin θ y' = x sin θ + y cos θ
为了演示这个,我们来看看X和Y的基本轴; 当我们逆时针旋转X轴90°时,最终应该将X轴变换为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°(旋转发生在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案例来说非常合适; 但是当需要同时围绕所有三个轴执行旋转时,由于该系统中固有的缺陷,欧拉角不足以表现为Gimbal锁。 在这种情况下,人们诉诸四元数,这比这更先进,但正确使用时不会受到万向锁的影响。
参考文档在这里:http://developer.android.com/reference/android/opengl/Matrix.html
你不需要了解数学,图书馆的功能将完成工作。
链接地址: http://www.djcxy.com/p/81811.html