189 {
190 float num = matrix.M11 + matrix.M22 + matrix.M33;
192 if (num > 0f)
193 {
194 float num2 = MathF.Sqrt(num + 1f);
195 result.W = num2 * 0.5f;
196 num2 = 0.5f / num2;
197 result.X = (matrix.M23 - matrix.M32) * num2;
198 result.Y = (matrix.M31 - matrix.M13) * num2;
199 result.Z = (matrix.M12 - matrix.M21) * num2;
200 }
201 else if (matrix.M11 >= matrix.M22 && matrix.M11 >= matrix.M33)
202 {
203 float num3 = MathF.Sqrt(1f + matrix.M11 - matrix.M22 - matrix.M33);
204 float num4 = 0.5f / num3;
205 result.X = 0.5f * num3;
206 result.Y = (matrix.M12 + matrix.M21) * num4;
207 result.Z = (matrix.M13 + matrix.M31) * num4;
208 result.W = (matrix.M23 - matrix.M32) * num4;
209 }
210 else if (matrix.M22 > matrix.M33)
211 {
212 float num5 = MathF.Sqrt(1f + matrix.M22 - matrix.M11 - matrix.M33);
213 float num6 = 0.5f / num5;
214 result.X = (matrix.M21 + matrix.M12) * num6;
215 result.Y = 0.5f * num5;
216 result.Z = (matrix.M32 + matrix.M23) * num6;
217 result.W = (matrix.M31 - matrix.M13) * num6;
218 }
219 else
220 {
221 float num7 = MathF.Sqrt(1f + matrix.M33 - matrix.M11 - matrix.M22);
222 float num8 = 0.5f / num7;
223 result.X = (matrix.M31 + matrix.M13) * num8;
224 result.Y = (matrix.M32 + matrix.M23) * num8;
225 result.Z = 0.5f * num7;
226 result.W = (matrix.M12 - matrix.M21) * num8;
227 }
228 return result;
229 }
Quaternion(float x, float y, float z, float w)