FC2ブログ

Matrix4x4の種類

Unity
12 /14 2017
<Matrix4x4の種類>

 「Matrix4x4.TRS()」や「Matrix4x4.SetTRS()」では、
 平行移動、回転、拡大縮小(スケーリング)を自由に設定できます。

 特に、transformの位置、回転状態、スケールを代入する場合、
 「localToWorldMatrix」という変換行列になります。
 これは、transformのローカル座標系にある3次元ベクトルを、
 ワールド座標系の3次元ベクトルへ変換する役割を持っています。
(位置の場合、相対座標にtransformの位置を加え、絶対座標にします)
 変換行列とベクトルの積を関数で行うのが、「TransformPoint()」です。

 その逆変換行列が、「worldToLocalMatrix」という変換行列であり、
 逆関数が、「InverseTransformPoint()」になります。
(位置の場合、絶対座標からtransformの位置を引き、相対座標にします)


 Matrix4x4 M, M1, M2, M3
 Vector3 Vs, rVs


・transform.localToWorldMatrix
 = M.SetTRS(transform.position, transform.rotation, transform.lossyScale)
 = M1 * M2 * M3
 M1.SetTRS (transform.position, Quaternion.identity, Vector3.one)
 M2.SetTRS (Vector3.zero, transform.rotation, Vector3.one)
 M3.SetTRS (Vector3.zero, Quaternion.identity, transform.lossyScale)

 transformのローカル座標から、ワールド座標へ変換する行列です。
 「①スケーリング*Vs→②回転*q→③平行移動+Vp」の順に適用され、
 「変換行列=平行移動行列*回転行列*スケーリング行列」になります。

 Vector4 = Vector4(Vector3.x, Vector3.y, Vector3.z, 1)の場合、
 「Vector4 = transform.localToWorldMatrix * Vector4」より、
 Vector3 = Vector3(Vector4.x, Vector4.y, Vector4.z)になります。

 「Vector3 = transform.TransformPoint(Vector3)」でも代用できます。
 Vector3→Vector4→Vector3の変換が不要なため簡便です。


・transform.worldToLocalMatrix
 = M3 * M2 * M1
 M1.SetTRS (-transform.position, Quaternion.identity, Vector3.one)
 M2.SetTRS (Vector3.zero, Quaternion.Inverse(transform.rotation), Vector3.one)
  Vs = transform.lossyScale
  rVs = new Vector3 (1 / Vs.x, 1 / Vs.y, 1 / Vs.z)

 M3.SetTRS (Vector3.zero, Quaternion.identity, rVs)

 ワールド座標から、transformのローカル座標へ変換する行列です。
 「①平行移動-Vp→②回転*q^(-1)→③スケーリング/Vs」の順に適用され、
 「変換行列=スケーリング行列*回転行列*平行移動行列」になります。

 Vector4 = Vector4(Vector3.x, Vector3.y, Vector3.z, 1)の場合、
 「Vector4 = transform.worldToLocalMatrix * Vector4」より、
 Vector3 = Vector3(Vector4.x, Vector4.y, Vector4.z)になります。

 「Vector3 = transform.InverseTransformPoint(Vector3)」でも代用できます。
 Vector3→Vector4→Vector3の変換が不要なため簡便です。

スポンサーサイト



コメント

非公開コメント

gamemaker

ゲーム自作を行っていく過程を書き留めていきます。