Unity中的四元数类详解【详解】

更新时间:2023-06-17 11:30:25 阅读: 评论:0

Unity中的四元数类详解【详解】
⼀、简介
Quaternion⼜称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地⾓度⽽⾔,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着⼀个四维空间,相对于复数为⼆维空间。
四元数
关于四元数的性质、与旋转的关系、球型线性插值的介绍,请阅读,在此不多做介绍。下⾯主要介绍的是Unity中的四元数-Quaternion。
在Unity中,⽤Quaternion来存储和表⽰对象的旋转⾓度。Quaternion的变换⽐较复杂,对于GameObject⼀般的旋转及移动,可以⽤Transform中的相关⽅法实现。
⼆、Quaternion类属性郑州思科培训
eulerAngles-欧拉⾓
定义
public Vector3 eulerAngles{get;t;}
如何改变⼀个游戏对象旋的转状态,我们可以通过改变其Transform进⾏欧拉⾓的变换次序,例如假设p(x,y,z)是游戏对象上的⼀个点,绕x轴旋转a⾓,绕y轴旋转b⾓,绕z轴旋转c⾓,这样就可以得到旋转之后的状态p'(x',y',z')。Unity的实现过程是很简单的,⼀句代码就可以搞定。但是具体的实现过程确实很复杂的,详情请阅读。
下⾯给出⼀个例⼦,演⽰⼀下如何使⽤欧拉⾓。
public class EulerAngler_ts : MonoBehaviour {
public Transform A, B;
摩挲
Quaternion rotations = Quaternion.identity;
Vector3 eulerAngle = ;
float speed = 10.0f;
float tSpeed = 0.0f;
// U this for initialization
void Start () {
}
幼儿学数学
// Update is called once per frame
void Update () {
tSpeed += speed * Time.deltaTime;
//第⼀种⽅式:将Quaternion实例对象赋值给transform的rotation
rotations.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f);
//第⼆种⽅式:将三位向量代表的欧拉⾓直接赋值给transform的eulerAngle
B.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f);
}
}
三、Quaternion类实例⽅法
1、SetFromToRotation⽅法-创建rotation实例
1.1 函数原型
sleepingbeautypublic void SetFromToRotion(Vector3 fromDirection,Vector3 toDirection);
可以创建⼀个从formDirection到toDirection的Quaternion实例。
生活大爆炸第一季17
Quaternion q = Quaternion.identity;
q.SetFromToRotation(v1,v2);
可以将GameObject对象进⾏如下变换:⾸先将GameObject对象⾃⾝坐标系的x,y,z轴⽅向和世界坐标系的x,y,z轴⽅向⼀致,然后将GameObject对象⾃⾝坐标系中向量V1指向的⽅向旋转到V2⽅向。
1.2 PS:不可以直接使⽤ation.SetFromToRotation(v1,v2)⽅式进⾏设置,只能将实例化的Quaternion复制给ation。
1.3 实例演⽰
public class SetFromToDirection_ts : MonoBehaviour {
public Transform A, B, C;
Quaternion q = Quaternion.identity;
// U this for initialization
void Start () {
}
// Update is called once per frame滚动体
void Update () {
q.SetFromToRotation(A.position, B.position);
Debug., A.position, d);
Debug., B.position, );
Debug.DrawLine(C.position, C.position + new Vector3(0.0f, 1.0f, 0.0f), Color.black);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.up * 1.5f), llow);
}
}
运⾏结果如下图所⽰:
2、SetLookRotation⽅法-设置Quaternion实例的朝向
2.1 函数原型
public void SetLookRotation(Vector3 view);
public void SetLookRotation(Vector3 view,Vector3 up);
例如:
Quaternion q = Quaternion.identity;
q.SetLookRotation(v1,v2);
transform.forward⽅向与V1⽅向相同。
transform.right垂直于由0、V1和V2这3点构成的平⾯。
V2决定了transform.up的朝向,因为当transform.forward和transform.right⽅向确定后,transform.up的⽅向总会与V2的⽅向的夹⾓⼩于或等于90度。
当V1为时,⽅法失效。
2.2 PS:同上,不要直接使⽤ation.SetLookRotation(v1,v2)的⽅式来实例化Quaternion对象。
2.3 实例演⽰
using UnityEngine;
using System.Collections;
public class SetLookRotation_ts : MonoBehaviour {
public Transform A, B, C;
Quaternion q = Quaternion.identity;
// U this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
q.SetLookRotation(A.position, B.position);
Debug., A.position, d);snapfit
Debug., B.position, );
Debug.DrawLine(C.position, C.TransformPoint(Vector3.right * 1.5f), Color.black);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.forward * 1.5f), llow);
Debug.Log("C.right与A的夹⾓: " + Vector3.Angle(C.right, A.position));
pozDebug.Log("C.right与B的夹⾓: " + Vector3.Angle(C.right, B.position));
Debug.Log("C.up与B的夹⾓: " + Vector3.Angle(C.up, B.position));
}
}
运⾏结果
3、ToAngleAxis⽅法
3.1 函数原型
public void ToAngleAxis(out float angle,out Vector3 axis);
参数angle为旋转⾓,参数axis为轴向量。
该函数可以实现将GameObject对象的rotation从Quaternion.identity状态变换到当前状态,只需要将GameObject对象绕着axis轴(世界坐标系)旋转angle⾓度即可。
3.2 实例演⽰
using UnityEngine;
using System.Collections;
public class ToAngleAxis_ts : MonoBehaviour {
public Transform A, B;
float angle;
Vector3 axis = ;
float xSpeed = 0.0f, ySpeed = 0.0f, zSpeed = 0.0f;
// U this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
xSpeed += 0.5f * Time.deltaTime;
ySpeed += 1.0f * Time.deltaTime;
zSpeed += 2.5f * Time.deltaTime;
A.eulerAngles = new Vector3(xSpeed, ySpeed, zSpeed);
//获取A的rotation的旋转轴和⾓度
//设置B的rotation,使得B的rotation和A相同
}
}
四、Quaternion类静态⽅法
青岛理工大学学报Quaternion中的静态⽅法有9个即:Angle⽅法、Dot⽅法、Euler⽅法、FromToRotation⽅法、Inver⽅法、Lerp⽅法、LookRotation⽅法、RotateToWards⽅法和Slerp⽅法。关于静态的⽅法的使⽤就是直接⽤类名调⽤其静态⽅法,例如
Quaternion.Angle(q1,q2);下⾯对这些静态⽅法做下分析。
1、Angle⽅法
1.1 函数原型
裁缝的读音
public static float Angle(Quaternion a,Quaternion b);
该⽅法可以计算两个旋转状态a达到b时需要旋转的最⼩夹⾓。
1.2 实例演⽰

本文发布于:2023-06-17 11:30:25,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/975190.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:旋转   对象   状态   实例   复数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图