TransformMatrix.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System;
  4. namespace O3DWB
  5. {
  6. [Serializable]
  7. public struct TransformMatrix
  8. {
  9. #region Private Static Variables
  10. private static TransformMatrix _identity = new TransformMatrix(Vector3.zero, Quaternion.identity, Vector3.one);
  11. #endregion
  12. #region Private Variables
  13. [SerializeField]
  14. private Vector3 _translation;
  15. [SerializeField]
  16. private Quaternion _rotation;
  17. [SerializeField]
  18. private Vector3 _scale;
  19. #endregion
  20. #region Constructors
  21. // Note: Supports only positive scale values.
  22. public TransformMatrix(Matrix4x4 matrix)
  23. {
  24. _translation = matrix.GetTranslation();
  25. _rotation = matrix.GetRotation();
  26. _scale = matrix.GetXYZScale();
  27. }
  28. public TransformMatrix(Vector3 translation, Quaternion rotation, Vector3 scale)
  29. {
  30. _translation = translation;
  31. _rotation = rotation;
  32. _scale = scale;
  33. }
  34. public TransformMatrix(TransformMatrix source)
  35. {
  36. _translation = source._translation;
  37. _rotation = source._rotation;
  38. _scale = source._scale;
  39. }
  40. public TransformMatrix(Transform transform)
  41. {
  42. _translation = transform.position;
  43. _rotation = transform.rotation;
  44. _scale = transform.lossyScale;
  45. }
  46. #endregion
  47. #region Public Properties
  48. public Vector3 Translation { get { return _translation; } set { _translation = value; } }
  49. public Quaternion Rotation { get { return _rotation; } set { _rotation = value; } }
  50. public Vector3 Scale { get { return _scale; } set { _scale = value; } }
  51. public float AllAxesScale { set { Scale = Vector3.one * value; } }
  52. public Matrix4x4 ToMatrix4x4x { get { return Matrix4x4.TRS(_translation, _rotation, _scale); } }
  53. public float XScale { get { return _scale[0]; } set { _scale[0] = value; } }
  54. public float YScale { get { return _scale[1]; } set { _scale[1] = value; } }
  55. public float ZScale { get { return _scale[2]; } set { _scale[2] = value; } }
  56. #endregion
  57. #region Public Static Functions
  58. public static TransformMatrix GetIdentity()
  59. {
  60. return _identity;
  61. }
  62. public static TransformMatrix operator * (TransformMatrix mtx1, TransformMatrix mtx2)
  63. {
  64. Matrix4x4 mtx1Scale = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, mtx1.Scale);
  65. Matrix4x4 mtx2Scale = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, mtx2.Scale);
  66. Matrix4x4 compScale = mtx1Scale * mtx2Scale;
  67. Vector3 newScale = compScale.GetSignedXYZScale();
  68. Matrix4x4 mtx1Rot = Matrix4x4.TRS(Vector3.zero, mtx1.Rotation, mtx1.Scale);
  69. Matrix4x4 mtx2Rot = Matrix4x4.TRS(Vector3.zero, mtx2.Rotation, mtx2.Scale);
  70. Matrix4x4 compRot = mtx1Rot * mtx2Rot;
  71. Quaternion newRotation = compRot.GetRotation();
  72. Vector3 newTranslation = mtx1.MultiplyPoint(mtx2.Translation);
  73. return new TransformMatrix(newTranslation, newRotation, newScale);
  74. }
  75. #endregion
  76. #region Public Methods
  77. public Vector3 MultiplyPointInverse(Vector3 point)
  78. {
  79. return ToMatrix4x4x.inverse.MultiplyPoint(point);
  80. }
  81. public Vector3 MultiplyPoint(Vector3 point)
  82. {
  83. return ToMatrix4x4x.MultiplyPoint(point);
  84. }
  85. public Vector3 MultiplyVectorInverse(Vector3 vector)
  86. {
  87. return ToMatrix4x4x.inverse.MultiplyVector(vector);
  88. }
  89. public Vector3 MultiplyVector(Vector3 vector)
  90. {
  91. return ToMatrix4x4x.MultiplyVector(vector);
  92. }
  93. public Vector3 GetNormalizedAxis(int axisIndex)
  94. {
  95. return ToMatrix4x4x.GetNormalizedAxis(axisIndex);
  96. }
  97. public Vector3 GetNormalizedRightAxis()
  98. {
  99. return ToMatrix4x4x.GetNormalizedRightAxis();
  100. }
  101. public Vector3 GetNormalizedRightAxisNoScaleSign()
  102. {
  103. Vector3 rightAxis = ToMatrix4x4x.GetNormalizedRightAxis();
  104. if (_scale.x < 0.0f) rightAxis *= -1.0f;
  105. return rightAxis;
  106. }
  107. public Vector3 GetNormalizedUpAxis()
  108. {
  109. return ToMatrix4x4x.GetNormalizedUpAxis();
  110. }
  111. public Vector3 GetNormalizedUpAxisNoScaleSign()
  112. {
  113. Vector3 upAxis = ToMatrix4x4x.GetNormalizedUpAxis();
  114. if (_scale.y < 0.0f) upAxis *= -1.0f;
  115. return upAxis;
  116. }
  117. public Vector3 GetNormalizedLookAxis()
  118. {
  119. return ToMatrix4x4x.GetNormalizedLookAxis();
  120. }
  121. public Vector3 GetNormalizedLookAxisNoScaleSign()
  122. {
  123. Vector3 lookAxis = ToMatrix4x4x.GetNormalizedLookAxis();
  124. if (_scale.z < 0.0f) lookAxis *= -1.0f;
  125. return lookAxis;
  126. }
  127. public Vector3[] GetNormalizedLocalAxes()
  128. {
  129. return ToMatrix4x4x.GetNormalizedLocalAxes();
  130. }
  131. public void Translate(Vector3 translationAmount)
  132. {
  133. _translation += translationAmount;
  134. }
  135. public void InvertAxisScale(CoordinateSystemAxis axis)
  136. {
  137. if (axis == CoordinateSystemAxis.PositiveRight || axis == CoordinateSystemAxis.NegativeRight) XScale = -XScale;
  138. else
  139. if (axis == CoordinateSystemAxis.PositiveUp || axis == CoordinateSystemAxis.NegativeUp) YScale = -YScale;
  140. else ZScale = -ZScale;
  141. }
  142. public int GetIndexOfAxisMostAlignedWith(Vector3 referenceAxis)
  143. {
  144. return ToMatrix4x4x.GetIndexOfAxisMostAlignedWith(referenceAxis);
  145. }
  146. public int GetIndexOfAxisAlignedWith(Vector3 referenceAxis)
  147. {
  148. return ToMatrix4x4x.GetIndexOfAxisAlignedWith(referenceAxis);
  149. }
  150. #endregion
  151. }
  152. }
  153. #endif