旋转向量 转 旋转矩阵 C++ 详细代码
时间: 2024-12-18 15:25:51 浏览: 6
python 和c++实现旋转矩阵到欧拉角的变换方式
在计算机图形学和游戏开发中,旋转向量(Quaternions)和旋转矩阵(Rotation Matrix)都是表示二维或三维空间中的旋转的重要工具。
旋转向量是一种数学结构,它包含一个实数部分和三个虚数部分,用于描述角度和方向。相比欧拉角(Euler Angles),旋转向量避免了旋转顺序导致的问题,并且运算效率更高,不会产生“ gimbal lock”现象。
旋转矩阵是一个4x4矩阵,用于表示绕着三个轴(X、Y、Z)的旋转。每一行和每一列对应一个旋转,通过一系列的旋转变换可以组合成复杂的旋转。
下面是一个简单的C++示例,展示如何创建旋转向量和计算旋转矩阵:
```cpp
#include <cmath>
#include <iostream>
// 定义旋转向量(Quaternion)
struct Quaternion {
float w, x, y, z;
Quaternion(float w=0, float x=0, float y=0, float z=0) : w(w), x(x), y(y), z(z) {}
};
// 计算旋转向量乘法(代表旋转操作)
Quaternion operator*(const Quaternion& q1, const Quaternion& q2) {
float w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z;
float x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y;
float y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x;
float z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w;
return Quaternion(w, x, y, z);
}
// 将旋转向量转换为旋转矩阵
Matrix4x4 toMatrix(const Quaternion& q) {
float qw = q.w, qx = q.x, qy = q.y, qz = q.z;
Matrix4x4 mat{
1 - 2 * (qy*qy + qz*qz), 2 * (qx*qy - qw*qz), 2 * (qw*qx + qy*qz), 0,
2 * (qx*qy + qw*qz), 1 - 2 * (qx*qx + qz*qz), 2 * (qy*qz - qw*qx), 0,
2 * (qw*qx - qy*qz), 2 * (qy*qz + qw*qx), 1 - 2 * (qx*qx + qy*qy), 0,
0, 0, 0, 1
};
return mat;
}
int main() {
Quaternion q(0, 1, 0, 0); // 非零旋转
Quaternion result = q * q; // 应该得到单位旋转向量(表示无旋转)
Matrix4x4 matrix = toMatrix(q);
std::cout << "Rotation Matrix:\n";
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
std::cout << matrix[i][j] << "\t";
return 0;
}
```
在这个例子中,我们首先定义了一个`Quaternion`结构体并实现了基本的乘法运算,接着提供了一个将旋转向量转换为矩阵的方法。注意,实际应用中通常需要处理更复杂的情况,如缩放、平移等,这里仅做简单示例。
阅读全文