Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Quaternion.cs
Go to the documentation of this file.
1using System;
5using Microsoft.Xna.Framework.Design;
6
8
10[TypeConverter(typeof(QuaternionConverter))]
11public struct Quaternion : IEquatable<Quaternion>
12{
13 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
14 public float X;
15
16 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
17 public float Y;
18
19 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
20 public float Z;
21
22 [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
23 public float W;
24
25 private static Quaternion _identity = new Quaternion(0f, 0f, 0f, 1f);
26
27 public static Quaternion Identity => _identity;
28
29 public Quaternion(float x, float y, float z, float w)
30 {
31 X = x;
32 Y = y;
33 Z = z;
34 W = w;
35 }
36
37 public Quaternion(Vector3 vectorPart, float scalarPart)
38 {
39 X = vectorPart.X;
40 Y = vectorPart.Y;
41 Z = vectorPart.Z;
42 W = scalarPart;
43 }
44
45 public override string ToString()
46 {
47 CultureInfo currentCulture = CultureInfo.CurrentCulture;
48 return string.Format(currentCulture, "{{X:{0} Y:{1} Z:{2} W:{3}}}", X.ToString(currentCulture), Y.ToString(currentCulture), Z.ToString(currentCulture), W.ToString(currentCulture));
49 }
50
51 public bool Equals(Quaternion other)
52 {
53 if (X == other.X && Y == other.Y && Z == other.Z)
54 {
55 return W == other.W;
56 }
57 return false;
58 }
59
60 public override bool Equals(object obj)
61 {
62 bool result = false;
63 if (obj is Quaternion)
64 {
65 result = Equals((Quaternion)obj);
66 }
67 return result;
68 }
69
70 public override int GetHashCode()
71 {
72 return X.GetHashCode() + Y.GetHashCode() + Z.GetHashCode() + W.GetHashCode();
73 }
74
75 public float LengthSquared()
76 {
77 return X * X + Y * Y + Z * Z + W * W;
78 }
79
80 public float Length()
81 {
82 float num = X * X + Y * Y + Z * Z + W * W;
83 return (float)Math.Sqrt(num);
84 }
85
86 public void Normalize()
87 {
88 float num = X * X + Y * Y + Z * Z + W * W;
89 float num2 = 1f / (float)Math.Sqrt(num);
90 X *= num2;
91 Y *= num2;
92 Z *= num2;
93 W *= num2;
94 }
95
96 public static Quaternion Normalize(Quaternion quaternion)
97 {
98 float num = quaternion.X * quaternion.X + quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z + quaternion.W * quaternion.W;
99 float num2 = 1f / (float)Math.Sqrt(num);
100 Quaternion result = default(Quaternion);
101 result.X = quaternion.X * num2;
102 result.Y = quaternion.Y * num2;
103 result.Z = quaternion.Z * num2;
104 result.W = quaternion.W * num2;
105 return result;
106 }
107
108 public static void Normalize(ref Quaternion quaternion, out Quaternion result)
109 {
110 float num = quaternion.X * quaternion.X + quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z + quaternion.W * quaternion.W;
111 float num2 = 1f / (float)Math.Sqrt(num);
112 result.X = quaternion.X * num2;
113 result.Y = quaternion.Y * num2;
114 result.Z = quaternion.Z * num2;
115 result.W = quaternion.W * num2;
116 }
117
118 public void Conjugate()
119 {
120 X = 0f - X;
121 Y = 0f - Y;
122 Z = 0f - Z;
123 }
124
126 {
127 Quaternion result = default(Quaternion);
128 result.X = 0f - value.X;
129 result.Y = 0f - value.Y;
130 result.Z = 0f - value.Z;
131 result.W = value.W;
132 return result;
133 }
134
135 public static void Conjugate(ref Quaternion value, out Quaternion result)
136 {
137 result.X = 0f - value.X;
138 result.Y = 0f - value.Y;
139 result.Z = 0f - value.Z;
140 result.W = value.W;
141 }
142
143 public static Quaternion Inverse(Quaternion quaternion)
144 {
145 float num = quaternion.X * quaternion.X + quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z + quaternion.W * quaternion.W;
146 float num2 = 1f / num;
147 Quaternion result = default(Quaternion);
148 result.X = (0f - quaternion.X) * num2;
149 result.Y = (0f - quaternion.Y) * num2;
150 result.Z = (0f - quaternion.Z) * num2;
151 result.W = quaternion.W * num2;
152 return result;
153 }
154
155 public static void Inverse(ref Quaternion quaternion, out Quaternion result)
156 {
157 float num = quaternion.X * quaternion.X + quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z + quaternion.W * quaternion.W;
158 float num2 = 1f / num;
159 result.X = (0f - quaternion.X) * num2;
160 result.Y = (0f - quaternion.Y) * num2;
161 result.Z = (0f - quaternion.Z) * num2;
162 result.W = quaternion.W * num2;
163 }
164
165 public static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
166 {
167 float num = angle * 0.5f;
168 float num2 = (float)Math.Sin(num);
169 float w = (float)Math.Cos(num);
170 Quaternion result = default(Quaternion);
171 result.X = axis.X * num2;
172 result.Y = axis.Y * num2;
173 result.Z = axis.Z * num2;
174 result.W = w;
175 return result;
176 }
177
178 public static void CreateFromAxisAngle(ref Vector3 axis, float angle, out Quaternion result)
179 {
180 float num = angle * 0.5f;
181 float num2 = (float)Math.Sin(num);
182 float w = (float)Math.Cos(num);
183 result.X = axis.X * num2;
184 result.Y = axis.Y * num2;
185 result.Z = axis.Z * num2;
186 result.W = w;
187 }
188
189 public static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll)
190 {
191 float num = roll * 0.5f;
192 float num2 = (float)Math.Sin(num);
193 float num3 = (float)Math.Cos(num);
194 float num4 = pitch * 0.5f;
195 float num5 = (float)Math.Sin(num4);
196 float num6 = (float)Math.Cos(num4);
197 float num7 = yaw * 0.5f;
198 float num8 = (float)Math.Sin(num7);
199 float num9 = (float)Math.Cos(num7);
200 Quaternion result = default(Quaternion);
201 result.X = num9 * num5 * num3 + num8 * num6 * num2;
202 result.Y = num8 * num6 * num3 - num9 * num5 * num2;
203 result.Z = num9 * num6 * num2 - num8 * num5 * num3;
204 result.W = num9 * num6 * num3 + num8 * num5 * num2;
205 return result;
206 }
207
208 public static void CreateFromYawPitchRoll(float yaw, float pitch, float roll, out Quaternion result)
209 {
210 float num = roll * 0.5f;
211 float num2 = (float)Math.Sin(num);
212 float num3 = (float)Math.Cos(num);
213 float num4 = pitch * 0.5f;
214 float num5 = (float)Math.Sin(num4);
215 float num6 = (float)Math.Cos(num4);
216 float num7 = yaw * 0.5f;
217 float num8 = (float)Math.Sin(num7);
218 float num9 = (float)Math.Cos(num7);
219 result.X = num9 * num5 * num3 + num8 * num6 * num2;
220 result.Y = num8 * num6 * num3 - num9 * num5 * num2;
221 result.Z = num9 * num6 * num2 - num8 * num5 * num3;
222 result.W = num9 * num6 * num3 + num8 * num5 * num2;
223 }
224
226 {
227 float num = matrix.M11 + matrix.M22 + matrix.M33;
228 Quaternion result = default(Quaternion);
229 if (num > 0f)
230 {
231 float num2 = (float)Math.Sqrt(num + 1f);
232 result.W = num2 * 0.5f;
233 num2 = 0.5f / num2;
234 result.X = (matrix.M23 - matrix.M32) * num2;
235 result.Y = (matrix.M31 - matrix.M13) * num2;
236 result.Z = (matrix.M12 - matrix.M21) * num2;
237 }
238 else if (matrix.M11 >= matrix.M22 && matrix.M11 >= matrix.M33)
239 {
240 float num3 = (float)Math.Sqrt(1f + matrix.M11 - matrix.M22 - matrix.M33);
241 float num4 = 0.5f / num3;
242 result.X = 0.5f * num3;
243 result.Y = (matrix.M12 + matrix.M21) * num4;
244 result.Z = (matrix.M13 + matrix.M31) * num4;
245 result.W = (matrix.M23 - matrix.M32) * num4;
246 }
247 else if (matrix.M22 > matrix.M33)
248 {
249 float num5 = (float)Math.Sqrt(1f + matrix.M22 - matrix.M11 - matrix.M33);
250 float num6 = 0.5f / num5;
251 result.X = (matrix.M21 + matrix.M12) * num6;
252 result.Y = 0.5f * num5;
253 result.Z = (matrix.M32 + matrix.M23) * num6;
254 result.W = (matrix.M31 - matrix.M13) * num6;
255 }
256 else
257 {
258 float num7 = (float)Math.Sqrt(1f + matrix.M33 - matrix.M11 - matrix.M22);
259 float num8 = 0.5f / num7;
260 result.X = (matrix.M31 + matrix.M13) * num8;
261 result.Y = (matrix.M32 + matrix.M23) * num8;
262 result.Z = 0.5f * num7;
263 result.W = (matrix.M12 - matrix.M21) * num8;
264 }
265 return result;
266 }
267
268 public static void CreateFromRotationMatrix(ref Matrix matrix, out Quaternion result)
269 {
270 float num = matrix.M11 + matrix.M22 + matrix.M33;
271 if (num > 0f)
272 {
273 float num2 = (float)Math.Sqrt(num + 1f);
274 result.W = num2 * 0.5f;
275 num2 = 0.5f / num2;
276 result.X = (matrix.M23 - matrix.M32) * num2;
277 result.Y = (matrix.M31 - matrix.M13) * num2;
278 result.Z = (matrix.M12 - matrix.M21) * num2;
279 }
280 else if (matrix.M11 >= matrix.M22 && matrix.M11 >= matrix.M33)
281 {
282 float num3 = (float)Math.Sqrt(1f + matrix.M11 - matrix.M22 - matrix.M33);
283 float num4 = 0.5f / num3;
284 result.X = 0.5f * num3;
285 result.Y = (matrix.M12 + matrix.M21) * num4;
286 result.Z = (matrix.M13 + matrix.M31) * num4;
287 result.W = (matrix.M23 - matrix.M32) * num4;
288 }
289 else if (matrix.M22 > matrix.M33)
290 {
291 float num5 = (float)Math.Sqrt(1f + matrix.M22 - matrix.M11 - matrix.M33);
292 float num6 = 0.5f / num5;
293 result.X = (matrix.M21 + matrix.M12) * num6;
294 result.Y = 0.5f * num5;
295 result.Z = (matrix.M32 + matrix.M23) * num6;
296 result.W = (matrix.M31 - matrix.M13) * num6;
297 }
298 else
299 {
300 float num7 = (float)Math.Sqrt(1f + matrix.M33 - matrix.M11 - matrix.M22);
301 float num8 = 0.5f / num7;
302 result.X = (matrix.M31 + matrix.M13) * num8;
303 result.Y = (matrix.M32 + matrix.M23) * num8;
304 result.Z = 0.5f * num7;
305 result.W = (matrix.M12 - matrix.M21) * num8;
306 }
307 }
308
309 public static float Dot(Quaternion quaternion1, Quaternion quaternion2)
310 {
311 return quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
312 }
313
314 public static void Dot(ref Quaternion quaternion1, ref Quaternion quaternion2, out float result)
315 {
316 result = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
317 }
318
319 public static Quaternion Slerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
320 {
321 float num = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
322 bool flag = false;
323 if (num < 0f)
324 {
325 flag = true;
326 num = 0f - num;
327 }
328 float num2;
329 float num3;
330 if (num > 0.999999f)
331 {
332 num2 = 1f - amount;
333 num3 = (flag ? (0f - amount) : amount);
334 }
335 else
336 {
337 float num4 = (float)Math.Acos(num);
338 float num5 = (float)(1.0 / Math.Sin(num4));
339 num2 = (float)Math.Sin((1f - amount) * num4) * num5;
340 num3 = (flag ? ((float)(0.0 - Math.Sin(amount * num4)) * num5) : ((float)Math.Sin(amount * num4) * num5));
341 }
342 Quaternion result = default(Quaternion);
343 result.X = num2 * quaternion1.X + num3 * quaternion2.X;
344 result.Y = num2 * quaternion1.Y + num3 * quaternion2.Y;
345 result.Z = num2 * quaternion1.Z + num3 * quaternion2.Z;
346 result.W = num2 * quaternion1.W + num3 * quaternion2.W;
347 return result;
348 }
349
350 public static void Slerp(ref Quaternion quaternion1, ref Quaternion quaternion2, float amount, out Quaternion result)
351 {
352 float num = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
353 bool flag = false;
354 if (num < 0f)
355 {
356 flag = true;
357 num = 0f - num;
358 }
359 float num2;
360 float num3;
361 if (num > 0.999999f)
362 {
363 num2 = 1f - amount;
364 num3 = (flag ? (0f - amount) : amount);
365 }
366 else
367 {
368 float num4 = (float)Math.Acos(num);
369 float num5 = (float)(1.0 / Math.Sin(num4));
370 num2 = (float)Math.Sin((1f - amount) * num4) * num5;
371 num3 = (flag ? ((float)(0.0 - Math.Sin(amount * num4)) * num5) : ((float)Math.Sin(amount * num4) * num5));
372 }
373 result.X = num2 * quaternion1.X + num3 * quaternion2.X;
374 result.Y = num2 * quaternion1.Y + num3 * quaternion2.Y;
375 result.Z = num2 * quaternion1.Z + num3 * quaternion2.Z;
376 result.W = num2 * quaternion1.W + num3 * quaternion2.W;
377 }
378
379 public static Quaternion Lerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
380 {
381 float num = 1f - amount;
382 Quaternion result = default(Quaternion);
383 float num2 = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
384 if (num2 >= 0f)
385 {
386 result.X = num * quaternion1.X + amount * quaternion2.X;
387 result.Y = num * quaternion1.Y + amount * quaternion2.Y;
388 result.Z = num * quaternion1.Z + amount * quaternion2.Z;
389 result.W = num * quaternion1.W + amount * quaternion2.W;
390 }
391 else
392 {
393 result.X = num * quaternion1.X - amount * quaternion2.X;
394 result.Y = num * quaternion1.Y - amount * quaternion2.Y;
395 result.Z = num * quaternion1.Z - amount * quaternion2.Z;
396 result.W = num * quaternion1.W - amount * quaternion2.W;
397 }
398 float num3 = result.X * result.X + result.Y * result.Y + result.Z * result.Z + result.W * result.W;
399 float num4 = 1f / (float)Math.Sqrt(num3);
400 result.X *= num4;
401 result.Y *= num4;
402 result.Z *= num4;
403 result.W *= num4;
404 return result;
405 }
406
407 public static void Lerp(ref Quaternion quaternion1, ref Quaternion quaternion2, float amount, out Quaternion result)
408 {
409 float num = 1f - amount;
410 float num2 = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
411 if (num2 >= 0f)
412 {
413 result.X = num * quaternion1.X + amount * quaternion2.X;
414 result.Y = num * quaternion1.Y + amount * quaternion2.Y;
415 result.Z = num * quaternion1.Z + amount * quaternion2.Z;
416 result.W = num * quaternion1.W + amount * quaternion2.W;
417 }
418 else
419 {
420 result.X = num * quaternion1.X - amount * quaternion2.X;
421 result.Y = num * quaternion1.Y - amount * quaternion2.Y;
422 result.Z = num * quaternion1.Z - amount * quaternion2.Z;
423 result.W = num * quaternion1.W - amount * quaternion2.W;
424 }
425 float num3 = result.X * result.X + result.Y * result.Y + result.Z * result.Z + result.W * result.W;
426 float num4 = 1f / (float)Math.Sqrt(num3);
427 result.X *= num4;
428 result.Y *= num4;
429 result.Z *= num4;
430 result.W *= num4;
431 }
432
433 public static Quaternion Concatenate(Quaternion value1, Quaternion value2)
434 {
435 float x = value2.X;
436 float y = value2.Y;
437 float z = value2.Z;
438 float w = value2.W;
439 float x2 = value1.X;
440 float y2 = value1.Y;
441 float z2 = value1.Z;
442 float w2 = value1.W;
443 float num = y * z2 - z * y2;
444 float num2 = z * x2 - x * z2;
445 float num3 = x * y2 - y * x2;
446 float num4 = x * x2 + y * y2 + z * z2;
447 Quaternion result = default(Quaternion);
448 result.X = x * w2 + x2 * w + num;
449 result.Y = y * w2 + y2 * w + num2;
450 result.Z = z * w2 + z2 * w + num3;
451 result.W = w * w2 - num4;
452 return result;
453 }
454
455 public static void Concatenate(ref Quaternion value1, ref Quaternion value2, out Quaternion result)
456 {
457 float x = value2.X;
458 float y = value2.Y;
459 float z = value2.Z;
460 float w = value2.W;
461 float x2 = value1.X;
462 float y2 = value1.Y;
463 float z2 = value1.Z;
464 float w2 = value1.W;
465 float num = y * z2 - z * y2;
466 float num2 = z * x2 - x * z2;
467 float num3 = x * y2 - y * x2;
468 float num4 = x * x2 + y * y2 + z * z2;
469 result.X = x * w2 + x2 * w + num;
470 result.Y = y * w2 + y2 * w + num2;
471 result.Z = z * w2 + z2 * w + num3;
472 result.W = w * w2 - num4;
473 }
474
475 public static Quaternion Negate(Quaternion quaternion)
476 {
477 Quaternion result = default(Quaternion);
478 result.X = 0f - quaternion.X;
479 result.Y = 0f - quaternion.Y;
480 result.Z = 0f - quaternion.Z;
481 result.W = 0f - quaternion.W;
482 return result;
483 }
484
485 public static void Negate(ref Quaternion quaternion, out Quaternion result)
486 {
487 result.X = 0f - quaternion.X;
488 result.Y = 0f - quaternion.Y;
489 result.Z = 0f - quaternion.Z;
490 result.W = 0f - quaternion.W;
491 }
492
493 public static Quaternion Add(Quaternion quaternion1, Quaternion quaternion2)
494 {
495 Quaternion result = default(Quaternion);
496 result.X = quaternion1.X + quaternion2.X;
497 result.Y = quaternion1.Y + quaternion2.Y;
498 result.Z = quaternion1.Z + quaternion2.Z;
499 result.W = quaternion1.W + quaternion2.W;
500 return result;
501 }
502
503 public static void Add(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
504 {
505 result.X = quaternion1.X + quaternion2.X;
506 result.Y = quaternion1.Y + quaternion2.Y;
507 result.Z = quaternion1.Z + quaternion2.Z;
508 result.W = quaternion1.W + quaternion2.W;
509 }
510
511 public static Quaternion Subtract(Quaternion quaternion1, Quaternion quaternion2)
512 {
513 Quaternion result = default(Quaternion);
514 result.X = quaternion1.X - quaternion2.X;
515 result.Y = quaternion1.Y - quaternion2.Y;
516 result.Z = quaternion1.Z - quaternion2.Z;
517 result.W = quaternion1.W - quaternion2.W;
518 return result;
519 }
520
521 public static void Subtract(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
522 {
523 result.X = quaternion1.X - quaternion2.X;
524 result.Y = quaternion1.Y - quaternion2.Y;
525 result.Z = quaternion1.Z - quaternion2.Z;
526 result.W = quaternion1.W - quaternion2.W;
527 }
528
529 public static Quaternion Multiply(Quaternion quaternion1, Quaternion quaternion2)
530 {
531 float x = quaternion1.X;
532 float y = quaternion1.Y;
533 float z = quaternion1.Z;
534 float w = quaternion1.W;
535 float x2 = quaternion2.X;
536 float y2 = quaternion2.Y;
537 float z2 = quaternion2.Z;
538 float w2 = quaternion2.W;
539 float num = y * z2 - z * y2;
540 float num2 = z * x2 - x * z2;
541 float num3 = x * y2 - y * x2;
542 float num4 = x * x2 + y * y2 + z * z2;
543 Quaternion result = default(Quaternion);
544 result.X = x * w2 + x2 * w + num;
545 result.Y = y * w2 + y2 * w + num2;
546 result.Z = z * w2 + z2 * w + num3;
547 result.W = w * w2 - num4;
548 return result;
549 }
550
551 public static void Multiply(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
552 {
553 float x = quaternion1.X;
554 float y = quaternion1.Y;
555 float z = quaternion1.Z;
556 float w = quaternion1.W;
557 float x2 = quaternion2.X;
558 float y2 = quaternion2.Y;
559 float z2 = quaternion2.Z;
560 float w2 = quaternion2.W;
561 float num = y * z2 - z * y2;
562 float num2 = z * x2 - x * z2;
563 float num3 = x * y2 - y * x2;
564 float num4 = x * x2 + y * y2 + z * z2;
565 result.X = x * w2 + x2 * w + num;
566 result.Y = y * w2 + y2 * w + num2;
567 result.Z = z * w2 + z2 * w + num3;
568 result.W = w * w2 - num4;
569 }
570
571 public static Quaternion Multiply(Quaternion quaternion1, float scaleFactor)
572 {
573 Quaternion result = default(Quaternion);
574 result.X = quaternion1.X * scaleFactor;
575 result.Y = quaternion1.Y * scaleFactor;
576 result.Z = quaternion1.Z * scaleFactor;
577 result.W = quaternion1.W * scaleFactor;
578 return result;
579 }
580
581 public static void Multiply(ref Quaternion quaternion1, float scaleFactor, out Quaternion result)
582 {
583 result.X = quaternion1.X * scaleFactor;
584 result.Y = quaternion1.Y * scaleFactor;
585 result.Z = quaternion1.Z * scaleFactor;
586 result.W = quaternion1.W * scaleFactor;
587 }
588
589 public static Quaternion Divide(Quaternion quaternion1, Quaternion quaternion2)
590 {
591 float x = quaternion1.X;
592 float y = quaternion1.Y;
593 float z = quaternion1.Z;
594 float w = quaternion1.W;
595 float num = quaternion2.X * quaternion2.X + quaternion2.Y * quaternion2.Y + quaternion2.Z * quaternion2.Z + quaternion2.W * quaternion2.W;
596 float num2 = 1f / num;
597 float num3 = (0f - quaternion2.X) * num2;
598 float num4 = (0f - quaternion2.Y) * num2;
599 float num5 = (0f - quaternion2.Z) * num2;
600 float num6 = quaternion2.W * num2;
601 float num7 = y * num5 - z * num4;
602 float num8 = z * num3 - x * num5;
603 float num9 = x * num4 - y * num3;
604 float num10 = x * num3 + y * num4 + z * num5;
605 Quaternion result = default(Quaternion);
606 result.X = x * num6 + num3 * w + num7;
607 result.Y = y * num6 + num4 * w + num8;
608 result.Z = z * num6 + num5 * w + num9;
609 result.W = w * num6 - num10;
610 return result;
611 }
612
613 public static void Divide(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
614 {
615 float x = quaternion1.X;
616 float y = quaternion1.Y;
617 float z = quaternion1.Z;
618 float w = quaternion1.W;
619 float num = quaternion2.X * quaternion2.X + quaternion2.Y * quaternion2.Y + quaternion2.Z * quaternion2.Z + quaternion2.W * quaternion2.W;
620 float num2 = 1f / num;
621 float num3 = (0f - quaternion2.X) * num2;
622 float num4 = (0f - quaternion2.Y) * num2;
623 float num5 = (0f - quaternion2.Z) * num2;
624 float num6 = quaternion2.W * num2;
625 float num7 = y * num5 - z * num4;
626 float num8 = z * num3 - x * num5;
627 float num9 = x * num4 - y * num3;
628 float num10 = x * num3 + y * num4 + z * num5;
629 result.X = x * num6 + num3 * w + num7;
630 result.Y = y * num6 + num4 * w + num8;
631 result.Z = z * num6 + num5 * w + num9;
632 result.W = w * num6 - num10;
633 }
634
635 public static Quaternion operator -(Quaternion quaternion)
636 {
637 Quaternion result = default(Quaternion);
638 result.X = 0f - quaternion.X;
639 result.Y = 0f - quaternion.Y;
640 result.Z = 0f - quaternion.Z;
641 result.W = 0f - quaternion.W;
642 return result;
643 }
644
645 public static bool operator ==(Quaternion quaternion1, Quaternion quaternion2)
646 {
647 if (quaternion1.X == quaternion2.X && quaternion1.Y == quaternion2.Y && quaternion1.Z == quaternion2.Z)
648 {
649 return quaternion1.W == quaternion2.W;
650 }
651 return false;
652 }
653
654 public static bool operator !=(Quaternion quaternion1, Quaternion quaternion2)
655 {
656 if (quaternion1.X == quaternion2.X && quaternion1.Y == quaternion2.Y && quaternion1.Z == quaternion2.Z)
657 {
658 return quaternion1.W != quaternion2.W;
659 }
660 return true;
661 }
662
663 public static Quaternion operator +(Quaternion quaternion1, Quaternion quaternion2)
664 {
665 Quaternion result = default(Quaternion);
666 result.X = quaternion1.X + quaternion2.X;
667 result.Y = quaternion1.Y + quaternion2.Y;
668 result.Z = quaternion1.Z + quaternion2.Z;
669 result.W = quaternion1.W + quaternion2.W;
670 return result;
671 }
672
673 public static Quaternion operator -(Quaternion quaternion1, Quaternion quaternion2)
674 {
675 Quaternion result = default(Quaternion);
676 result.X = quaternion1.X - quaternion2.X;
677 result.Y = quaternion1.Y - quaternion2.Y;
678 result.Z = quaternion1.Z - quaternion2.Z;
679 result.W = quaternion1.W - quaternion2.W;
680 return result;
681 }
682
683 public static Quaternion operator *(Quaternion quaternion1, Quaternion quaternion2)
684 {
685 float x = quaternion1.X;
686 float y = quaternion1.Y;
687 float z = quaternion1.Z;
688 float w = quaternion1.W;
689 float x2 = quaternion2.X;
690 float y2 = quaternion2.Y;
691 float z2 = quaternion2.Z;
692 float w2 = quaternion2.W;
693 float num = y * z2 - z * y2;
694 float num2 = z * x2 - x * z2;
695 float num3 = x * y2 - y * x2;
696 float num4 = x * x2 + y * y2 + z * z2;
697 Quaternion result = default(Quaternion);
698 result.X = x * w2 + x2 * w + num;
699 result.Y = y * w2 + y2 * w + num2;
700 result.Z = z * w2 + z2 * w + num3;
701 result.W = w * w2 - num4;
702 return result;
703 }
704
705 public static Quaternion operator *(Quaternion quaternion1, float scaleFactor)
706 {
707 Quaternion result = default(Quaternion);
708 result.X = quaternion1.X * scaleFactor;
709 result.Y = quaternion1.Y * scaleFactor;
710 result.Z = quaternion1.Z * scaleFactor;
711 result.W = quaternion1.W * scaleFactor;
712 return result;
713 }
714
715 public static Quaternion operator /(Quaternion quaternion1, Quaternion quaternion2)
716 {
717 float x = quaternion1.X;
718 float y = quaternion1.Y;
719 float z = quaternion1.Z;
720 float w = quaternion1.W;
721 float num = quaternion2.X * quaternion2.X + quaternion2.Y * quaternion2.Y + quaternion2.Z * quaternion2.Z + quaternion2.W * quaternion2.W;
722 float num2 = 1f / num;
723 float num3 = (0f - quaternion2.X) * num2;
724 float num4 = (0f - quaternion2.Y) * num2;
725 float num5 = (0f - quaternion2.Z) * num2;
726 float num6 = quaternion2.W * num2;
727 float num7 = y * num5 - z * num4;
728 float num8 = z * num3 - x * num5;
729 float num9 = x * num4 - y * num3;
730 float num10 = x * num3 + y * num4 + z * num5;
731 Quaternion result = default(Quaternion);
732 result.X = x * num6 + num3 * w + num7;
733 result.Y = y * num6 + num4 * w + num8;
734 result.Z = z * num6 + num5 * w + num9;
735 result.W = w * num6 - num10;
736 return result;
737 }
738}
static CultureInfo CurrentCulture
static double Acos(double d)
static double Cos(double d)
static double Sqrt(double d)
static double Sin(double a)
static bool operator==(Quaternion quaternion1, Quaternion quaternion2)
static Quaternion CreateFromRotationMatrix(Matrix matrix)
static Quaternion Subtract(Quaternion quaternion1, Quaternion quaternion2)
static void CreateFromAxisAngle(ref Vector3 axis, float angle, out Quaternion result)
static bool operator!=(Quaternion quaternion1, Quaternion quaternion2)
static void Lerp(ref Quaternion quaternion1, ref Quaternion quaternion2, float amount, out Quaternion result)
static void CreateFromYawPitchRoll(float yaw, float pitch, float roll, out Quaternion result)
static Quaternion Conjugate(Quaternion value)
static void Subtract(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
static void Multiply(ref Quaternion quaternion1, float scaleFactor, out Quaternion result)
static Quaternion Lerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
static Quaternion operator*(Quaternion quaternion1, Quaternion quaternion2)
static void Negate(ref Quaternion quaternion, out Quaternion result)
static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
static void Add(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
static void Conjugate(ref Quaternion value, out Quaternion result)
static Quaternion Normalize(Quaternion quaternion)
Definition Quaternion.cs:96
Quaternion(float x, float y, float z, float w)
Definition Quaternion.cs:29
static void Dot(ref Quaternion quaternion1, ref Quaternion quaternion2, out float result)
bool Equals(Quaternion other)
Definition Quaternion.cs:51
static void Concatenate(ref Quaternion value1, ref Quaternion value2, out Quaternion result)
static void Normalize(ref Quaternion quaternion, out Quaternion result)
static Quaternion Inverse(Quaternion quaternion)
static Quaternion Slerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
static void Slerp(ref Quaternion quaternion1, ref Quaternion quaternion2, float amount, out Quaternion result)
static float Dot(Quaternion quaternion1, Quaternion quaternion2)
static Quaternion Add(Quaternion quaternion1, Quaternion quaternion2)
static Quaternion Multiply(Quaternion quaternion1, float scaleFactor)
static Quaternion Concatenate(Quaternion value1, Quaternion value2)
Quaternion(Vector3 vectorPart, float scalarPart)
Definition Quaternion.cs:37
static void CreateFromRotationMatrix(ref Matrix matrix, out Quaternion result)
static Quaternion operator/(Quaternion quaternion1, Quaternion quaternion2)
static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll)
override bool Equals(object obj)
Definition Quaternion.cs:60
static Quaternion Divide(Quaternion quaternion1, Quaternion quaternion2)
static void Inverse(ref Quaternion quaternion, out Quaternion result)
static void Divide(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
static Quaternion operator+(Quaternion quaternion1, Quaternion quaternion2)
static Quaternion Multiply(Quaternion quaternion1, Quaternion quaternion2)
static Quaternion Negate(Quaternion quaternion)
static void Multiply(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result)
static Quaternion operator-(Quaternion quaternion)