Unity 3 D Quaternionの各属性と関数テスト

6055 ワード

Quaternionプロパティとメソッド
一、属性:
x、y、zは言わないで、ただ1つのeulerAnglesを見て、コードは以下の通りです:
public Quaternion rotation = Quaternion.identity;

void Start()
{
rotation.eulerAngles = new Vector3(0, 30, 0);
transform.rotation = rotation;
print(rotation.eulerAngles.y);
}
効果:物体をy軸回りに時計回りに30°回転させ、効果とtransform.Euler Anglesは同じです.物体rotation=(0,30,0).しかしtransformには直接はできません.rotation.Euler Angle賦課.
二、方法
1,function ToAngleAxis (out angle :float, out axis :Vector3) :void
public float angle = 0.0F;
public Vector3 axis = Vector3.zero;

void Start()
{
transform.eulerAngles = new Vector3(0, 90, 0);
transform.rotation.ToAngleAxis(out angle, out axis);
print(angle + " " + axis);
}
効果:物体の回転角度をanglesとaxis(物体のz軸と世界座標のz軸の挟み角)に戻します.
入力:transform.localEulerAngles=(0,0,0);
出力:angle=0、axis=(1,0,0);
入力:transform.localEulerAngles=(0,90,0);
出力:angle=90、axis=(0,1,0);
入力:transform.localEulerAngles=(270,0,0);
出力:angle=90、axis=(-1,0,0)
2,function SetFromToRotation (fromDirection :Vector3, toDirection :Vector3) :void
private Vector3 _from = Vector3.one;
private Vector3 _to = new Vector3(100f, 200f, 100f);
private Quaternion q;
private Vector3 headUpDir;

void Start()
{
q.SetFromToRotation(_from, _to);
transform.rotation=q;
headUpDir=transform.TransformDirection(Vector3.forward);
}
効果:物体のfromDirectionをtoDirectionに回転
入力:a=Vector 3(0,0,1);b=Vector 3(0,1,0)//z軸をy軸に向ける
出力:q=(-0.7,0,0,0.7);headUpDir=(0,1,0)
入力:a=Vector 3(0,0,1);b=Vector 3(1,0,0)//z軸をx軸に向ける
出力:q=(0,0.7,0,0.7);headUpDir=(1,0,0)
入力:a=Vector 3(0,1,0);b=Vector 3(1,0,0)//y軸をx軸に向ける
出力:q=(0,0,-0.7,0.7);headUpDir=(0,0,1)
3,function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
public Transform obj1;
public Transform obj2;
Quaternion q;

void Update()
{
q.SetLookRotation(obj1.position, obj2.position);
transform.rotation = q;
}
効果:LookAt()のように、物体1を常に物体2に注視させる
4, static operator * (lhs : Quaternion, rhs : Quaternion) : Quaternion
public Transform extraRotation;

void Update()
{
transform.rotation *= extraRotation.rotation;
}
効果:回転lhsとrhsを組み合わせます.1つの点を回転し、まずlhsを使用し、次にrhsを使用して回転し、組み合わせを使用して回転するのと同じです.注意回転交換不可:lhs*rhsはrhs*lhsに等しくありません.回転の角度は*番の両側の角度を加算することだと理解しています.
5,static operator * (rotation : Quaternion, point : Vector3) : Vector3
Vector3 relativeDirection = Vector3.forward;
Vector3 absoluteDirection;

void Update () {
absoluteDirection = transform.rotation * relativeDirection;
transform.position += absoluteDirection * Time.deltaTime;
}

効果:あるベクトルをrotationに基づいて別のベクトルに回転します.
6,static function Dot(a:Quaternion,b:Quaternion):float効果:2つのQuaternionをポイント乗算し、1つのfloat値を返し、意味は補充されます.7,static function AngleAxis (angle : float, axis : Vector3) : Quaternion
 void Start(){
        transform.rotation = Quaternion.AngleAxis(30, Vector3.up);
}
効果:物体をaxisの周りにangle度回転させます.
8,static function FromToRotation (fromDirection :Vector3, toDirection :Vector3) : Quaternion 
transform.rotation = Quaternion.FromToRotation(Vector3.up, transform.forward);
効果:SetFromToRotationとはあまり差がなく、Quaternionを返すことができます.一般に、transformの軸方向(例えばy軸)をtoDirectionと世界座標で同期させるために使用される.
9,static function LookRotation (forward :Vector3, upwards :Vector3 =Vector3.up) : Quaternion
効果:SetLootRotationと差が少なく、Quaternionを返すことができます.
10,static function Slerp (from : Quaternion, to : Quaternion, t :float) : Quaternion 
    public Transform from;
    public Transform to;
    public float speed = 0.1F;
    void Update() {
        transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);
    }
効果:球面補間、補間は等角速度ではなく、変速です.ますます遅くなる感じがします.
11,static function Lerp (from : Quaternion, to : Quaternion, t :float) : Quaternion 
効果:Slerpとの効果はそれほど悪くなく、効率はSlerpより高いが、fromとtoの差が大きすぎると効果が悪くなり、標準化されたQuaternionが返される.
12,static function RotateTowards (from : Quaternion, to : Quaternion, maxDegreesDelta :float) : Quaternion
効果:fromからtoまで角度を回転します.Slerpとほぼ同じですが、この関数の角速度はmaxDegreesDeltaを超えることはありません.負のmaxDegreesDelta値は、回転をtoから遠ざけます.
13,static function Inverse (rotation : Quaternion) : Quaternion 
効果:反転した回転を返します.
14,static function Angle (a : Quaternion, b : Quaternion) :float
public Transform target;
void Update(){
     float angle = Quaternion.Angle(transform.rotation, target.rotation);
}

効果:aとbの間の角度を返します.
15,static function Euler (x :float, y :float, z :float) : Quaternion .
public Quaternion rotation = Quaternion.Euler(0, 30, 0);

効果:回転角度を対応するQuaternionにします.
三、実例
var target : Transform;
var edgeBorder = 0.1;
var horizontalSpeed = 360.0;
var verticalSpeed = 120.0;
var minVertical = 20.0;
var maxVertical = 85.0;

private var x = 0.0;
private var y = 0.0;
private var distance = 0.0;

function Start()
{
	x = transform.eulerAngles.y;
    y = transform.eulerAngles.x;
    distance = (transform.position - target.position).magnitude;
}

function LateUpdate()
{
	var dt = Time.deltaTime;
	x -= Input.GetAxis("Horizontal") * horizontalSpeed * dt;
	y += Input.GetAxis("Vertical") * verticalSpeed * dt;
	
	y = ClampAngle(y, minVertical, maxVertical);
	 
	var rotation = Quaternion.Euler(y, x, 0);
	var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
	//print(rotation + " && " + rotation * Vector3(0.0, 0.0, -distance));
	transform.rotation = rotation;
	transform.position = position;
}

static function ClampAngle (angle : float, min : float, max : float) {
	if (angle < -360)
		angle += 360;
	if (angle > 360)
		angle -= 360;
	return Mathf.Clamp (angle, min, max);
}
は非常に興味深い例で、Unityの公式プロジェクトShadowDemoProjectから来て、キーボードを通じてカメラを球面の上で運動するように少し自由に回転させることができます.
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
この文はとても面白くて、理解しにくいです.この文を完全に理解すると、Quaternionはあなたの手の中でとても強くなります.