Skip to content

Commit cd63255

Browse files
committed
Fixed Matrix4::GetScale() and added Matrix4::GetRotation() to extract rotation.
1 parent 10693e9 commit cd63255

File tree

1 file changed

+58
-1
lines changed

1 file changed

+58
-1
lines changed

Foundation/Public/Aurora.Math/Matrix4.hpp

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,11 @@ inline namespace Math
128128
// -=(Undocumented)=-
129129
Vector3<Base> GetScale() const
130130
{
131-
return Vector3<Base>(GetComponent(0), GetComponent(5), GetComponent(10));
131+
const Vector3<Base> XAxis(GetComponent(0), GetComponent(1), GetComponent(2));
132+
const Vector3<Base> YAxis(GetComponent(4), GetComponent(5), GetComponent(6));
133+
const Vector3<Base> ZAxis(GetComponent(8), GetComponent(9), GetComponent(10));
134+
135+
return Vector3<Base>(XAxis.GetLength(), YAxis.GetLength(), ZAxis.GetLength());
132136
}
133137

134138
// -=(Undocumented)=-
@@ -137,6 +141,59 @@ inline namespace Math
137141
return Vector3<Base>(GetComponent(12), GetComponent(13), GetComponent(14));
138142
}
139143

144+
// -=(Undocumented)=-
145+
Quaternion<Base> GetRotation() const
146+
{
147+
const Base M00 = GetComponent(0);
148+
const Base M01 = GetComponent(1);
149+
const Base M02 = GetComponent(2);
150+
const Base M10 = GetComponent(4);
151+
const Base M11 = GetComponent(5);
152+
const Base M12 = GetComponent(6);
153+
const Base M20 = GetComponent(8);
154+
const Base M21 = GetComponent(9);
155+
const Base M22 = GetComponent(10);
156+
157+
const Base Trace = M00 + M11 + M22;
158+
159+
if (Trace > 0.0)
160+
{
161+
const Base S = Sqrt(Trace + 1.0) * 2.0;
162+
return Quaternion<Base>(
163+
(M21 - M12) / S,
164+
(M02 - M20) / S,
165+
(M10 - M01) / S,
166+
0.25 * S);
167+
}
168+
else if (M00 > M11 && M00 > M22)
169+
{
170+
const Base S = Sqrt(1.0 + M00 - M11 - M22) * 2.0;
171+
return Quaternion<Base>(
172+
0.25 * S,
173+
(M01 + M10) / S,
174+
(M02 + M20) / S,
175+
(M21 - M12) / S);
176+
}
177+
else if (M11 > M22)
178+
{
179+
const Base S = Sqrt(1.0 + M11 - M00 - M22) * 2.0;
180+
return Quaternion<Base>(
181+
(M01 + M10) / S,
182+
0.25 * S,
183+
(M12 + M21) / S,
184+
(M02 - M20) / S);
185+
}
186+
else
187+
{
188+
const Base S = Sqrt(1.0 + M22 - M00 - M11) * 2.0;
189+
return Quaternion<Base>(
190+
(M02 + M20) / S,
191+
(M12 + M21) / S,
192+
0.25 * S,
193+
(M10 - M01) / S);
194+
}
195+
}
196+
140197
// -=(Undocumented)=-
141198
Matrix4<Base> Inverse() const
142199
{

0 commit comments

Comments
 (0)