変換の基礎
変換の基礎
行列の掛け算による平行移動変換、及びスケール変換はMatrix4x4クラスのメモを参照
回転変換
物体の回転移動には
- 四元数を使った回転
- オイラー角を使った回転
の2種類がある
以下の行列方程式はオイラー角の回転変換を利用している。これらのタイプの回転は残念ながら別々に考える必要がある
(単純な2Dゲームでは利用価値があるか?(要検証)
又、回転の軸は原点が基準になっている点にも注意
A(50,40)、B(100,40)、C(75,200)の三点で構成された三角形を行列変換でZ軸回転させるサンプル
この例の中にunityの標準関数であるMatrix4x4.SetTRSを参考に利用している。自前で回転行列を作成する方法と合わせて参考にすること
(実はunityの標準関数のほうがクォータニオンの回転変換なので間違いが無い)
尚、自前の方はオイラー角を利用した回転変換なのでジンバルロックする可能性がある事に注意!
using UnityEngine;
using System.Collections;
public class MatrixTest8 : MonoBehaviour {
public float rotate=45.0f; Vector3[] trigon,rotateAfter,unityRotateAfter; Matrix4x4 zAxisRoll,unityTRS;
void Start () { trigon = new Vector3[3]; rotateAfter = new Vector3[3]; unityRotateAfter = new Vector3[3];
trigon[0].Set(50,40,0); trigon[1].Set(100,40,0); trigon[2].Set(75,200,0);
zAxisRoll = Matrix4x4.identity; zAxisRoll.m00 = Mathf.Cos(rotate * Mathf.Deg2Rad); zAxisRoll.m01 = -1 * Mathf.Sin(rotate * Mathf.Deg2Rad); zAxisRoll.m10 = Mathf.Sin(rotate * Mathf.Deg2Rad); zAxisRoll.m11 = Mathf.Cos(rotate * Mathf.Deg2Rad);
for (int i = 0; i < 3; i++) { rotateAfter[i] = zAxisRoll.MultiplyPoint3x4(trigon[i]); }
//unityの標準関数で一度に移動、クォータニオン回転、拡縮。変換を適用できる行列を作成できる unityTRS.SetTRS(new Vector3(-100,0,0),Quaternion.Euler (0,0,rotate),Vector3.one); for (int i = 0; i < 3; i++) { unityRotateAfter[i] = unityTRS.MultiplyPoint3x4(trigon[i]); }
}
void DrawTrigon (Vector3[] trigon) { Debug.DrawLine(trigon[0],trigon[1]); Debug.DrawLine(trigon[1],trigon[2]); Debug.DrawLine(trigon[2],trigon[0]); } void Update () { DrawTrigon(trigon); DrawTrigon(rotateAfter); DrawTrigon(unityRotateAfter); }
}
- 最終更新:2013-12-05 00:44:46