问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

三维坐标旋转矩阵推导过程以及C语言实现

创作时间:
作者:
@小白创作中心

三维坐标旋转矩阵推导过程以及C语言实现

引用
1
来源
1.
https://www.cnblogs.com/shumei52/p/18604930

三维坐标旋转矩阵是计算机图形学、机器人学等领域中的重要基础概念。本文从二维坐标点的旋转开始,逐步推导出三维坐标点绕X、Y、Z轴的旋转矩阵,并给出了C语言实现代码。

本文的前提假设如下:

  • 坐标系采用右手坐标系
  • 角度逆时针旋转为正
  • 绕X轴旋转角度为俯仰角(Pitch)
  • 绕Y轴旋转角度为偏航角(Yaw)
  • 绕Z轴旋转角度为翻滚角(Roll)

1. 平面二维坐标点的旋转

根据三角函数关系,可以列出向量OP与OP'的坐标表示形式:

x = |OP|•cosα
y = |OP|•sinα

x′ = |OP|•cos(α+β)
y′ = |OP|•sin(α+β)

将P′(x′,y′)表达式展开:

x′ = |OP|•cos(α+β) = |OP|•(cosα•cosβ - sinα•sinβ) = x•cosβ - y•sinβ
y′ = |OP|•sin(α+β) = |OP|•(sinα•cosβ + cosα•sinβ) = x•sinβ + y•cosβ

为方便运算理解,我们将二维点旋转表示为矩阵:

2. 立体三维坐标点的旋转

绕Z轴旋转

参考二维点旋转矩阵同样的推导流程,我们可以推导出来三维点绕Z轴旋转的坐标表达式:

x′ = |OP|•cos(α+β) = |OP|•(cosα•cosβ - sinα•sinβ) = x•cosβ - y•sinβ
y′ = |OP|•sin(α+β) = |OP|•(sinα•cosβ + cosα•sinβ) = x•sinβ + y•cosβ
z′ = z

为方便运算理解,我们将三维点旋转表示为矩阵:

绕Y轴旋转

绕X轴旋转

绕三轴旋转(先绕x,再绕y,最后绕z轴旋转)

整理后的表达式为:

3. C语言实现

float* matconv(float* a, float b[3][8]) {
    float res[3];
    for (int i = 0; i < 3; i++)
        res[i] = b[i][0] * a[0] + b[i][9] * a[1] + b[i][10] * a[2];
    for (int i = 0; i < 3; i++) a[i] = res[i];
    return a;
}

void rotate(float* obj, float x, float y, float z) {
    x /= M_PI;
    y /= M_PI;
    z /= M_PI;
    float rz[3][11] = {{cos(z), -sin(z), 0}, {sin(z), cos(z), 0}, {0, 0, 1}};
    float ry[3][12] = {{1, 0, 0}, {0, cos(y), -sin(y)}, {0, sin(y), cos(y)}};
    float rx[3][13] = {{cos(x), 0, sin(x)}, {0, 1, 0}, {-sin(x), 0, cos(x)}};
    matconv(matconv(matconv(obj, rx), ry), rz);
}

float point[3] = {15, 17, 0};
rotate(point, 0.1, 0.2, 0.3);

4. 与SDL实现旋转的矩形

本文介绍了三维坐标旋转矩阵的推导过程和C语言实现,对于学习计算机图形学、机器人学等领域的读者具有较高的参考价值。本文原文来自博客园。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号