simd_quatF 到欧拉角

问题描述

我正在尝试将我的 quats 转换为欧拉,但在 x/y/z 分量中,只有我的 X 具有准确的值,而 y/z 不正确:-(任何人都可以看看/帮助吗?

func quatToEulerAngles(_ quat: simd_quatf) -> SIMD3<Double>{
    
    
    var angles = SIMD3<Double>();
    let qfloat = quat.vector
    let q = SIMD4<Double>(Double(qfloat.x),Double(qfloat.y),Double(qfloat.z),Double(qfloat.w))
    // roll (x-axis rotation)
    
    let sinr_cosp : Double = 2.0 * (q.w * q.x + q.y * q.z);
    let cosr_cosp : Double = 1.0 - 2.0 * (q.x * q.x + q.y * q.y);
    angles.x = atan2(sinr_cosp,cosr_cosp);
    
    // pitch (y-axis rotation)
    let sinp : Double = 2 * (q.w * q.y - q.z * q.x);
    if (abs(sinp) >= 1){
        angles.y = copysign(Double.pi / 2,sinp); // use 90 degrees if out of range
    }
    else{
        angles.y = asin(sinp);
    }
    // yaw (z-axis rotation)
    let siny_cosp : Double = 2 * (q.w * q.z + q.x * q.y);
    let cosy_cosp : Double = 1 - 2 * (q.y * q.y + q.z * q.z);
    angles.z = atan2(siny_cosp,cosy_cosp);
    
    return angles;
}

Wiki 示例已转换为 swift。 TIA

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)