gpt4 book ai didi

math - 在 3D 空间中旋转矢量

转载 作者:行者123 更新时间:2023-12-03 01:15:14 25 4
gpt4 key购买 nike

我正在 opengl es 中制作一个 android 项目,它使用加速度计来计算特定轴的变化,我的目标是旋转我的类似航天器的物体的运动矢量。问题是我无法理解旋转矩阵背后的数学。默认运动向量是 0,1,0 ,表示 +y,所以物体一开始是向上看的。我正在尝试旋转它的运动向量,以便我可以将对象移动到它指向的地方。我可以收集手机中的旋转变化。 x轴:旋转[0],y轴:旋转[1],z轴:旋转[2]。如何使用旋转矩阵旋转我的运动向量?

最佳答案

如果你想旋转一个向量,你应该构建所谓的 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'|
3D 旋转
这适用于 2D,而在 3D 中,我们需要考虑第三个轴。在 2D 中围绕原点(一个点)旋转一个矢量意味着在 3D 中围绕 Z 轴(一条线)旋转它;由于我们围绕 Z 轴旋转,因此其坐标应保持不变,即 0°(旋转发生在 3D 中的 XY 平面上)。在围绕 Z 轴旋转的 3D 中将是
    |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'|
注释 1 :围绕其旋转的轴在矩阵中没有正弦或余弦元素。
注 2:这种执行旋转的方法遵循 Euler angle轮换系统,简单易学,易掌握。这对于 2D 和简单的 3D 情况非常适用;但是当需要同时围绕所有三个轴进行旋转时,由于该系统的固有缺陷,欧拉角可能不够用,表现为 Gimbal lock .人诉诸 Quaternion s 在这种情况下,这比这更先进,但在正确使用时不会受到万向节锁定的影响。
我希望这澄清了基本的轮换。
旋转不是革命
上述矩阵沿半径为 r 的圆以距离原点 r = √(x² + y²) 的距离旋转对象;查找 polar coordinates知道为什么。这种旋转将相对于世界空间原点,也就是一场革命。通常我们需要围绕它自己的框架/枢轴而不是围绕世界(即本地原点)旋转对象。这也可以看作是 r = 0 的特殊情况。由于并非所有对象都位于世界原点,因此仅使用这些矩阵进行旋转不会产生围绕对象自身框架旋转的理想结果。你先 translate (移动)对象到世界原点(这样对象的原点将与世界的原点对齐,从而使 r = 0),使用这些矩阵中的一个(或多个)执行旋转,然后将其再次平移回其先前的位置。应用变换的顺序 matters .将多个变换组合在一起称为串联或组合。
作品
我强烈建议您在使用代码转换之前阅读线性和仿射转换及其组合,以便一次性执行多个转换。如果不了解其背后的基本数学原理,调试转换将是一场噩梦。我找到了 this lecture video成为一个很好的资源。另一个资源是 this tutorial on transformations旨在直观并用动画说明想法(警告:由我创作!)。
绕任意向量旋转
如果您只需要像发布的问题那样围绕基本轴(X、Y 或 Z)旋转,那么上述矩阵的乘积就足够了。但是,在许多情况下,您可能希望围绕任意轴/向量旋转。 Rodrigues' formula (又名轴角公式)是这个问题的常用解决方案。但是,只有当您只使用向量和矩阵时才使用它。如果您使用的是 Quaternion s,只需构建一个具有所需向量和角度的四元数。四元数是存储和操作 3D 旋转的绝佳选择;它紧凑而快速,例如在轴角表示中连接两个旋转相当昂贵,矩阵适中但四元数便宜。通常所有的旋转操作都是用四元数完成的,最后一步是在上传到渲染管道时转换为矩阵。见 Understanding Quaternions对于四元数的体面的入门。

关于math - 在 3D 空间中旋转矢量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com