You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将glm::quat转换为glm::vec3欧拉角并还原初始数据?

如何将glm::quat转换回原始欧拉角(90, 30, 45)

要把四元数转回你初始的欧拉角,核心是和四元数生成时使用完全一致的旋转顺序,GLM提供了直接的转换函数,具体步骤如下:

1. 补全四元数的w分量

你给出的四元数只有x、y、z三个分量(0.730946, 0.016590, 0.677650),四元数需要四个分量(w, x, y, z)且满足模长为1。可以通过以下公式计算w:

float w = sqrt(1.0f - (0.730946*0.730946 + 0.016590*0.016590 + 0.677650*0.677650));
// 计算得w≈0.0795

2. 使用GLM的eulerAngles函数转换

GLM的glm::eulerAngles函数会将四元数转回欧拉角,默认采用YXZ旋转顺序(这也是GLM从欧拉角转四元数的默认顺序)。代码示例:

#include <glm/glm.hpp>
#include <glm/gtc/quaternion.hpp>
#include <glm/gtc/matrix_transform.hpp>

int main() {
    // 构建完整四元数(w, x, y, z顺序)
    glm::quat q(0.0795f, 0.730946f, 0.016590f, 0.677650f);
    
    // 转回弧度制欧拉角
    glm::vec3 eulerRadians = glm::eulerAngles(q);
    
    // 转换为角度制
    glm::vec3 eulerDegrees = glm::degrees(eulerRadians);
    
    // eulerDegrees 会接近 glm::vec3(90, 30, 45),存在微小浮点误差
    return 0;
}

关键注意事项

  • 旋转顺序必须严格匹配:如果你当初生成四元数时用了非默认的旋转顺序(比如ZXY),转欧拉角时必须指定相同顺序。例如GLM 0.9.9+版本支持:
    glm::vec3 eulerRadians = glm::eulerAngles(q, glm::ZXY);
    
  • 浮点误差处理:由于四元数和欧拉角转换的精度问题,结果可能是89.9999或90.0001这类值,可以用近似判断或四舍五入处理。
  • 万向锁情况:你的初始欧拉角X轴为90度,刚好处于YXZ顺序的万向锁临界点,这时候可能会得到和原始值不同但旋转等价的欧拉角。如果必须还原到精确的(90,30,45),需要确保转换时的顺序和初始生成四元数的顺序完全一致。

内容的提问来源于stack exchange,提问作者St_rt_la

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:43:11