微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

欧拉四元数和旋转矩阵

如何解决欧拉四元数和旋转矩阵

我正在尝试在简单的Metal应用程序中实现四元数,但遇到了问题。我仔细检查了所有内容,从数学角度看似乎是正确的,但结果根本不正确。

所以基本上,这应该产生一个转换矩阵,我将其应用于顶点

static func FromEuler(_ eul: simd_float3) -> simd_quatf{
        
        let yaw = eul[0]
        let pitch = eul[1]
        let roll = eul[2]
        
        let cy = cos(yaw * 0.5);
        let sy = sin(yaw * 0.5);
        let cp = cos(pitch * 0.5);
        let sp = sin(pitch * 0.5);
        let cr = cos(roll * 0.5);
        let sr = sin(roll * 0.5);
        
        let qw = cr * cp * cy + sr * sp * sy;
        let qx = sr * cp * cy - cr * sp * sy;
        let qy = cr * sp * cy + sr * cp * sy;
        let qz = cr * cp * sy - sr * sp * cy;
        
        return simd_quatf(ix:qx,iy:qy,iz:qz,r:qw)
    }
    
    func ToMat4x4()-> matrix_float4x4{
        
        let qx = self.imag.x
        let qy = self.imag.y
        let qz = self.imag.z
        let qw = self.real
        
        return matrix_float4x4(rows: [
            simd_float4(1 - 2*qy*qy - 2*qz*qz,2*qx*qy - 2*qz*qw,2*qx*qz + 2*qy*qw,0),simd_float4(2*qx*qy + 2*qz*qw,1 - 2*qx*qx - 2*qz*qz,2*qy*qz + 2*qx*qw,simd_float4(2*qx*qz - 2*qy*qw,2*qy*qz - 2*qx*qw,1 - 2*qx*qx - 2*qy*qy,simd_float4(0,1)
        ])
    }

这是我的变换矩阵

func Transform() -> matrix_float4x4{
        
        //Perform Translation matrix
        let translate : matrix_float4x4 = matrix_float4x4(rows: [
            simd_float4(1,self.position[0]),1,self.position[1]),self.position[2]),1)
        ])
        
        //Scale matrix
        let scale : matrix_float4x4 = matrix_float4x4(rows: [
            simd_float4(self.scale[0],self.scale[1],self.scale[2],1)
        ])
        
        
        //Rotation
        //Get quaternion from euler
        let quaternion = simd_quatf.FromEuler(self.rotation)
        
        
        return translate * quaternion.ToMat4x4() * scale
    }

然后在着色器中,我只需执行Matrix * VertexPosition The Triangle rotated 90 degrees z axis变成了飞机!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。