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

时间:2019-09-28 20:16:30

标签: c++ vector 3d rotation trigonometry

我不知道如何进行此操作,有人知道我如何使用偏航,俯仰和滚转来旋转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是带度数的函数。

2 个答案:

答案 0 :(得分:1)

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

有了这些,您将发现“偏航,滚动,俯仰”,即Euler angles or Tait-Bryan angles只是一种以给定顺序应用绕主轴旋转的方法。

答案 1 :(得分:0)

您可以使用旋转矩阵来完成技巧。 https://en.wikipedia.org/wiki/Rotation_matrix

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