Unity - 四元数

200 阅读1分钟

定义

四元数是简单的超复数,由实数加上三个虚数单位组成,主要用于在三维空间中表示旋转。理解即可。

Unity中四元数初始化方法

1.轴角对公式初始化

四元数Q = [cos(β/2),sin(β/2)x,sin(β/2)y,sin(β/2)z]
Quaternion quaternion = new Quaternion(sin(β/2)x,sin(β/2)y,sin(β/2)z,cos(β/2));

2.轴角对方法初始化(一般都是使用这种方式)

四元数Q =  Quaternion a = Quaternion.AngleAxis(角度,轴);
//这里的Vertor3.forward是当前物体的Z轴,而不是世界坐标Z轴
Quaternion a = Quaternion.AngleAxis(60, Vector3.forward);

代码示例

private void Start()
{    
    //创建一个Cube    
    var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);    
    //设置cube的四元数    
    cube.transform.rotation = Quaternion.AngleAxis(60, Vector3.right);
}

四元数不会有欧拉角万向节死锁问题。物体A首先沿X轴旋转90°,然后在Update里面沿Y轴不停的旋转,可以看到不会有万向节死锁了。

代码示例

public class Test : MonoBehaviour
{    
    public Transform A;​    
    private void Start()    
    {            
    }​    
    private void Update()    
    {        
        //四元数 * 四元数 表示旋转四元数        
        A.transform.rotation *= Quaternion.AngleAxis(1,Vector3.up);    
    }
}

四元数与欧拉角转换

欧拉角转四元数

//x轴旋转60°
Quaternion q = Quaternion.Euler(60,0,0);

四元数转欧拉角

//x轴旋转60°
Quaternion q = Quaternion.Euler(60, 0, 0);
//四元数转欧拉角var euler = q.eulerAngles;

qrcode.jpg