如何使用偏航、俯仰和滚动旋转 3D 矢量?

How do I rotate a 3D vector using yaw, pitch, and roll?

本文关键字:旋转 滚动 3D 矢量 何使用      更新时间:2023-10-16

我不知道我会怎么做,有谁知道我如何使用偏航、俯仰和滚动来旋转 x、y 和 z?,我只能设法做 2D 旋转,但这不是我想要的。这是我拥有的当前代码。

偏航和俯仰,以及滚动应该以度为单位。不是弧度。

class Vector3
{//
public:
float x, y, z;
void rotate(float yaw, float pitch, float roll) {
}
};

不需要外部库的解决方案值得赞赏。

编辑:

void rotate(float yaw, float pitch, float roll) { //X Y Z Rotation
float cosa = cos_r(yaw); float cosb = cos_r(pitch); float cosc = cos_r(roll);
float sina = sin_r(yaw); float sinb = sin_r(pitch); float sinc = sin_r(roll);
float Axx = cosa * cosb;
float Axy = cosa * sinb * sinc - sina * cosc;
float Axz = cosa * sinb * cosc + sina * sinc;
float Ayx = sina * cosb;
float Ayy = sina * sinb * sinc + cosa * cosc;
float Ayz = sina * sinb * cosc - cosa * sinc;
float Azx = -sinb;
float Azy = cosb * sinc;
float Azz = cosb * cosc;
float px = x; float py = y; float pz = z;
x = Axx * px + Axy * py + Axz * pz;
y = Ayx * px + Ayy * py + Ayz * pz;
z = Azx * px + Azy * py + Azz * pz;
}

我试过这个,但没有用。 cos_r和sin_r是需要学位的函数。

由于您正在实现自己的 3D 矢量类,因此您可能还希望实现一些基本的矩阵运算。特别是,您需要旋转矩阵。链接的维基百科部分显示了围绕 X、Y 或 Z 轴旋转的简单基写。

一旦你有了它,你会发现"偏航,滚动,俯仰",即欧拉角或泰特-布莱恩角只是以给定顺序围绕主轴应用旋转的一种方式。

您可以使用旋转矩阵来解决问题。 https://en.wikipedia.org/wiki/Rotation_matrix

您需要做的就是将矢量乘以所需旋转的矩阵。