OROCHI
 
Loading...
Searching...
No Matches
GxQuaternion.inl
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11
12GX_CORE_NAMESPACE_BEGIN()
13
14//===========================================================================
15// GxQuaternion
16//===========================================================================
17//---------------------------------------------------------------------------
18// コンストラクタ
23//---------------------------------------------------------------------------
24GX_FORCE_INLINE GxQuaternion::GxQuaternion(f32 x, f32 y, f32 z, f32 w)
25 : _x(x)
26 , _y(y)
27 , _z(z)
28 , _w(w)
29{
30}
31
32//---------------------------------------------------------------------------
33// コンストラクタ
35//---------------------------------------------------------------------------
36GX_FORCE_INLINE GxQuaternion::GxQuaternion(const GxFloat4& float4)
37 : _x(float4._x)
38 , _y(float4._y)
39 , _z(float4._z)
40 , _w(float4._w)
41{
42}
43
44//---------------------------------------------------------------------------
45// コンストラクタ
47//---------------------------------------------------------------------------
48GX_FORCE_INLINE GxQuaternion::GxQuaternion(const f32* pFloatArray)
49 : _x(pFloatArray[0])
50 , _y(pFloatArray[1])
51 , _z(pFloatArray[2])
52 , _w(pFloatArray[3])
53{
54}
55
56//---------------------------------------------------------------------------
57// コンストラクタ
60//---------------------------------------------------------------------------
61GX_FORCE_INLINE GxQuaternion::GxQuaternion(const GxVector3& vector, f32 w)
62 : _x(vector._x)
63 , _y(vector._y)
64 , _z(vector._z)
65 , _w(w)
66{
67}
68
69//---------------------------------------------------------------------------
70// コンストラクタ
72//---------------------------------------------------------------------------
73GX_FORCE_INLINE GxQuaternion::GxQuaternion(const GxVector4& vector)
74 : _x(vector._x)
75 , _y(vector._y)
76 , _z(vector._z)
77 , _w(vector._w)
78{
79}
80
81//---------------------------------------------------------------------------
82// コンストラクタ
84//---------------------------------------------------------------------------
85GX_FORCE_INLINE GxQuaternion::GxQuaternion(const GxMatrixAffine& matrix)
86{
87 setRotate(matrix);
88}
89
90//---------------------------------------------------------------------------
91// コンストラクタ
93//---------------------------------------------------------------------------
94GX_FORCE_INLINE GxQuaternion::GxQuaternion(const GxMatrix44& matrix)
95{
96 setRotate(matrix);
97}
98
99//---------------------------------------------------------------------------
100// コピーコンストラクタ
102//---------------------------------------------------------------------------
103GX_FORCE_INLINE GxQuaternion::GxQuaternion(const GxQuaternion& quaternion)
104 : _x(quaternion._x)
105 , _y(quaternion._y)
106 , _z(quaternion._z)
107 , _w(quaternion._w)
108{
109}
110
111//---------------------------------------------------------------------------
112// 代入
115//---------------------------------------------------------------------------
116GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator = (const GxQuaternion& quaternion)
117{
118 _x = quaternion._x;
119 _y = quaternion._y;
120 _z = quaternion._z;
121 _w = quaternion._w;
122 return *this;
123}
124
125//---------------------------------------------------------------------------
126// スカラ加算代入
129//---------------------------------------------------------------------------
130GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator += (f32 scalar)
131{
132 addScalar(scalar);
133 return *this;
134}
135
136//---------------------------------------------------------------------------
137// スカラ減算代入
140//---------------------------------------------------------------------------
141GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator -= (f32 scalar)
142{
143 subScalar(scalar);
144 return *this;
145}
146
147//---------------------------------------------------------------------------
148// スカラ乗算代入
151//---------------------------------------------------------------------------
152GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator *= (f32 scalar)
153{
154 mulScalar(scalar);
155 return *this;
156}
157
158//---------------------------------------------------------------------------
159// スカラ除算代入
162//---------------------------------------------------------------------------
163GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator /= (f32 scalar)
164{
165 divScalar(scalar);
166 return *this;
167}
168
169//---------------------------------------------------------------------------
170// クォータニオン加算代入
173//---------------------------------------------------------------------------
174GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator += (const GxQuaternion& quaternion)
175{
176 addQuaternion(quaternion);
177 return *this;
178}
179
180//---------------------------------------------------------------------------
181// クォータニオン減算代入
184//---------------------------------------------------------------------------
185GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator -= (const GxQuaternion& quaternion)
186{
187 subQuaternion(quaternion);
188 return *this;
189}
190
191//---------------------------------------------------------------------------
192// クォータニオン乗算代入
195//---------------------------------------------------------------------------
196GX_FORCE_INLINE GxQuaternion& GxQuaternion::operator *= (const GxQuaternion& quaternion)
197{
198 mulQuaternion(quaternion);
199 return *this;
200}
201
202//---------------------------------------------------------------------------
203// スカラ加算
207//---------------------------------------------------------------------------
208GX_FORCE_INLINE const GxQuaternion operator + (const GxQuaternion& quaternion, f32 scalar)
209{
210 GxQuaternion result;
211 return GxQuaternion::getAddScalar(result, quaternion, scalar);
212}
213
214//---------------------------------------------------------------------------
215// スカラ減算
219//---------------------------------------------------------------------------
220GX_FORCE_INLINE const GxQuaternion operator - (const GxQuaternion& quaternion, f32 scalar)
221{
222 GxQuaternion result;
223 return GxQuaternion::getSubScalar(result, quaternion, scalar);
224}
225
226//---------------------------------------------------------------------------
227// スカラ乗算
231//---------------------------------------------------------------------------
232GX_FORCE_INLINE const GxQuaternion operator * (const GxQuaternion& quaternion, f32 scalar)
233{
234 GxQuaternion result;
235 return GxQuaternion::getMulScalar(result, quaternion, scalar);
236}
237
238//---------------------------------------------------------------------------
239// スカラ乗算
243//---------------------------------------------------------------------------
244GX_FORCE_INLINE const GxQuaternion operator * (f32 scalar, const GxQuaternion& quaternion)
245{
246 GxQuaternion result;
247 return GxQuaternion::getMulScalar(result, quaternion, scalar);
248}
249
250//---------------------------------------------------------------------------
251// スカラ除算
255//---------------------------------------------------------------------------
256GX_FORCE_INLINE const GxQuaternion operator / (const GxQuaternion& quaternion, f32 scalar)
257{
258 GxQuaternion result;
259 return GxQuaternion::getDivScalar(result, quaternion, scalar);
260}
261
262//---------------------------------------------------------------------------
263// クォータニオン加算
267//---------------------------------------------------------------------------
268GX_FORCE_INLINE const GxQuaternion operator + (const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
269{
270 GxQuaternion result;
271 return GxQuaternion::getAddQuaternion(result, quaternion0, quaternion1);
272}
273
274//---------------------------------------------------------------------------
275// クォータニオン減算
279//---------------------------------------------------------------------------
280GX_FORCE_INLINE const GxQuaternion operator - (const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
281{
282 GxQuaternion result;
283 return GxQuaternion::getSubQuaternion(result, quaternion0, quaternion1);
284}
285
286//---------------------------------------------------------------------------
287// クォータニオン乗算
291//---------------------------------------------------------------------------
292GX_FORCE_INLINE const GxQuaternion operator * (const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
293{
294 GxQuaternion result;
295 return GxQuaternion::getMulQuaternion(result, quaternion0, quaternion1);
296}
297
298//---------------------------------------------------------------------------
299// 一致
303//---------------------------------------------------------------------------
304GX_FORCE_INLINE b32 operator == (const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
305{
306 return (quaternion0._x == quaternion1._x) && (quaternion0._y == quaternion1._y) && (quaternion0._z == quaternion1._z) && (quaternion0._w == quaternion1._w);
307}
308
309//---------------------------------------------------------------------------
310// 不一致
314//---------------------------------------------------------------------------
315GX_FORCE_INLINE b32 operator != (const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
316{
317 return (quaternion0._x != quaternion1._x) || (quaternion0._y != quaternion1._y) || (quaternion0._z != quaternion1._z) || (quaternion0._w != quaternion1._w);
318}
319
320//---------------------------------------------------------------------------
321// 長さを取得
323//---------------------------------------------------------------------------
324GX_FORCE_INLINE f32 GxQuaternion::getLength(void) const
325{
327}
328
329//---------------------------------------------------------------------------
330// 長さの2乗を取得
332//---------------------------------------------------------------------------
333GX_FORCE_INLINE f32 GxQuaternion::getLengthSquare(void) const
334{
335 return _x * _x + _y * _y + _z * _z + _w * _w;
336}
337
338//---------------------------------------------------------------------------
339// 正規化クォータニオンを取得
341//---------------------------------------------------------------------------
342GX_FORCE_INLINE GxQuaternion GxQuaternion::getNormalize(void) const
343{
344 const auto inverseLength = 1.0f / getLength();
345
346 return GxQuaternion(
347 _x * inverseLength,
348 _y * inverseLength,
349 _z * inverseLength,
350 _w * inverseLength);
351}
352
353//---------------------------------------------------------------------------
354// 正規化クォータニオンを取得(長さ0に対応)
356//---------------------------------------------------------------------------
358{
359 const auto lengthSquare = getLengthSquare();
360
361 if( F32_ABS_MIN < lengthSquare )
362 {
363 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
364
365 return GxQuaternion(
366 _x * inverseLength,
367 _y * inverseLength,
368 _z * inverseLength,
369 _w * inverseLength);
370 }
371 else
372 {
373 return GxQuaternion(
374 0.0f,
375 0.0f,
376 0.0f,
377 0.0f);
378 }
379}
380
381//---------------------------------------------------------------------------
382// 共役クォータニオンを取得
384//---------------------------------------------------------------------------
385GX_FORCE_INLINE GxQuaternion GxQuaternion::getConjugate(void) const
386{
387 return GxQuaternion(-_x, -_y, -_z, _w);
388}
389
390//---------------------------------------------------------------------------
391// 逆クォータニオンを取得
393//---------------------------------------------------------------------------
394GX_FORCE_INLINE GxQuaternion GxQuaternion::getInverse(void) const
395{
396 auto lengthSquare = getLengthSquare();
397 if(lengthSquare <= F32_ABS_MIN )
398 {
399 return GxQuaternion::ZERO;
400 }
401
402 auto inverseLengthSquare = 1.0f / lengthSquare;
403
404 return GxQuaternion(-_x * inverseLengthSquare, -_y * inverseLengthSquare, -_z * inverseLengthSquare, _w * inverseLengthSquare);
405}
406
407//---------------------------------------------------------------------------
408// ベクトルから回転を設定
410//---------------------------------------------------------------------------
411GX_FORCE_INLINE void GxQuaternion::setRotate(const GxVector3& vector)
412{
413 setRotate(vector._y, vector._x, vector._z);
414}
415
416//---------------------------------------------------------------------------
417// X軸回転を設定
419//---------------------------------------------------------------------------
420GX_FORCE_INLINE void GxQuaternion::setRotateX(f32 radian)
421{
422 radian *= 0.5f;
423 _x = GxMath::getSin(radian);
424 _y = 0.0f;
425 _z = 0.0f;
426 _w = GxMath::getCos(radian);
427}
428
429//---------------------------------------------------------------------------
430// Y軸回転を設定
432//---------------------------------------------------------------------------
433GX_FORCE_INLINE void GxQuaternion::setRotateY(f32 radian)
434{
435 radian *= 0.5f;
436 _x = 0.0f;
437 _y = GxMath::getSin(radian);
438 _z = 0.0f;
439 _w = GxMath::getCos(radian);
440}
441
442//---------------------------------------------------------------------------
443// Z軸回転を設定
445//---------------------------------------------------------------------------
446GX_FORCE_INLINE void GxQuaternion::setRotateZ(f32 radian)
447{
448 radian *= 0.5f;
449 _x = 0.0f;
450 _y = 0.0f;
451 _z = GxMath::getSin(radian);
452 _w = GxMath::getCos(radian);
453}
454
455//---------------------------------------------------------------------------
456// スカラ加算を取得
461//---------------------------------------------------------------------------
462GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getAddScalar(GxQuaternion& dst, const GxQuaternion& quaternion, f32 scalar)
463{
464 dst._x = quaternion._x + scalar;
465 dst._y = quaternion._y + scalar;
466 dst._z = quaternion._z + scalar;
467 dst._w = quaternion._w + scalar;
468
469 return dst;
470}
471
472//---------------------------------------------------------------------------
473// スカラ減算を取得
478//---------------------------------------------------------------------------
479GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getSubScalar(GxQuaternion& dst, const GxQuaternion& quaternion, f32 scalar)
480{
481 dst._x = quaternion._x - scalar;
482 dst._y = quaternion._y - scalar;
483 dst._z = quaternion._z - scalar;
484 dst._w = quaternion._w - scalar;
485
486 return dst;
487}
488
489//---------------------------------------------------------------------------
490// スカラ乗算を取得
495//---------------------------------------------------------------------------
496GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulScalar(GxQuaternion& dst, const GxQuaternion& quaternion, f32 scalar)
497{
498 dst._x = quaternion._x * scalar;
499 dst._y = quaternion._y * scalar;
500 dst._z = quaternion._z * scalar;
501 dst._w = quaternion._w * scalar;
502
503 return dst;
504}
505
506//---------------------------------------------------------------------------
507// スカラ除算を取得
512//---------------------------------------------------------------------------
513GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getDivScalar(GxQuaternion& dst, const GxQuaternion& quaternion, f32 scalar)
514{
515 auto inverseScalar = 1.0f / scalar;
516
517 dst._x = quaternion._x * inverseScalar;
518 dst._y = quaternion._y * inverseScalar;
519 dst._z = quaternion._z * inverseScalar;
520 dst._w = quaternion._w * inverseScalar;
521
522 return dst;
523}
524
525//---------------------------------------------------------------------------
526// クォータニオン加算を取得
531//---------------------------------------------------------------------------
532GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getAddQuaternion(GxQuaternion& dst, const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
533{
534 dst._x = quaternion0._x + quaternion1._x;
535 dst._y = quaternion0._y + quaternion1._y;
536 dst._z = quaternion0._z + quaternion1._z;
537 dst._w = quaternion0._w + quaternion1._w;
538
539 return dst;
540}
541
542//---------------------------------------------------------------------------
543// クォータニオン減算を取得
548//---------------------------------------------------------------------------
549GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getSubQuaternion(GxQuaternion& dst, const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
550{
551 dst._x = quaternion0._x - quaternion1._x;
552 dst._y = quaternion0._y - quaternion1._y;
553 dst._z = quaternion0._z - quaternion1._z;
554 dst._w = quaternion0._w - quaternion1._w;
555
556 return dst;
557}
558
559//---------------------------------------------------------------------------
560// クォータニオン乗算を取得
565//---------------------------------------------------------------------------
566GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulQuaternion(GxQuaternion& dst, const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
567{
568 dst._x = quaternion0._y * quaternion1._z - quaternion0._z * quaternion1._y + quaternion0._w * quaternion1._x + quaternion0._x * quaternion1._w;
569 dst._y = quaternion0._z * quaternion1._x - quaternion0._x * quaternion1._z + quaternion0._w * quaternion1._y + quaternion0._y * quaternion1._w;
570 dst._z = quaternion0._x * quaternion1._y - quaternion0._y * quaternion1._x + quaternion0._w * quaternion1._z + quaternion0._z * quaternion1._w;
571 dst._w = quaternion0._w * quaternion1._w - quaternion0._x * quaternion1._x - quaternion0._y * quaternion1._y - quaternion0._z * quaternion1._z;
572
573 return dst;
574}
575
576//---------------------------------------------------------------------------
577// 正規化クォータニオンを取得
581//---------------------------------------------------------------------------
582GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getNormalize(GxQuaternion& dst, const GxQuaternion& quaternion)
583{
584 const auto inverseLength = 1.0f / quaternion.getLength();
585
586 dst._x = quaternion._x * inverseLength;
587 dst._y = quaternion._y * inverseLength;
588 dst._z = quaternion._z * inverseLength;
589 dst._w = quaternion._w * inverseLength;
590
591 return dst;
592}
593
594//---------------------------------------------------------------------------
595// 正規化クォータニオンを取得(長さ0に対応)
599//---------------------------------------------------------------------------
600GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getNormalizeEx(GxQuaternion& dst, const GxQuaternion& quaternion)
601{
602 const auto lengthSquare = quaternion.getLengthSquare();
603
604 if( F32_ABS_MIN < lengthSquare )
605 {
606 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
607
608 dst._x = quaternion._x * inverseLength;
609 dst._y = quaternion._y * inverseLength;
610 dst._z = quaternion._z * inverseLength;
611 dst._w = quaternion._w * inverseLength;
612 }
613 else
614 {
615 dst._x = 0.0f;
616 dst._y = 0.0f;
617 dst._z = 0.0f;
618 dst._w = 0.0f;
619 }
620
621 return dst;
622}
623
624//---------------------------------------------------------------------------
625// 共役クォータニオンを取得
629//---------------------------------------------------------------------------
630GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getConjugate(GxQuaternion& dst, const GxQuaternion& quaternion)
631{
632 dst._x = -quaternion._x;
633 dst._y = -quaternion._y;
634 dst._z = -quaternion._z;
635 dst._w = quaternion._w;
636
637 return dst;
638}
639
640//---------------------------------------------------------------------------
641// 逆クォータニオンを取得
645//---------------------------------------------------------------------------
646GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getInverse(GxQuaternion& dst, const GxQuaternion& quaternion)
647{
648 auto lengthSquare = quaternion.getLengthSquare();
649 if(lengthSquare <= F32_ABS_MIN )
650 {
651 dst._x = 0.0f;
652 dst._y = 0.0f;
653 dst._z = 0.0f;
654 dst._w = 0.0f;
655 }
656 else
657 {
658 auto inverseLengthSquare = 1.0f / lengthSquare;
659 dst._x = -quaternion._x * inverseLengthSquare;
660 dst._y = -quaternion._y * inverseLengthSquare;
661 dst._z = -quaternion._z * inverseLengthSquare;
662 dst._w = quaternion._w * inverseLengthSquare;
663 }
664
665 return dst;
666}
667
668//---------------------------------------------------------------------------
669// X軸回転乗算を取得
674//---------------------------------------------------------------------------
675GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateX(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radian)
676{
677 dst = quaternion;
678 dst.mulRotateX(radian);
679
680 return dst;
681}
682
683//---------------------------------------------------------------------------
684// Y軸回転乗算を取得
689//---------------------------------------------------------------------------
690GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateY(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radian)
691{
692 dst = quaternion;
693 dst.mulRotateY(radian);
694
695 return dst;
696}
697
698//---------------------------------------------------------------------------
699// Z軸回転乗算を取得
704//---------------------------------------------------------------------------
705GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateZ(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radian)
706{
707 dst = quaternion;
708 dst.mulRotateZ(radian);
709
710 return dst;
711}
712
713//---------------------------------------------------------------------------
714// XYZ軸回転乗算を取得
721//---------------------------------------------------------------------------
722GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateXYZ(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radianX, f32 radianY, f32 radianZ)
723{
724 dst = quaternion;
725 dst.mulRotateXYZ(radianX, radianY, radianZ);
726
727 return dst;
728}
729
730//---------------------------------------------------------------------------
731// XZY軸回転乗算を取得
738//---------------------------------------------------------------------------
739GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateXZY(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radianX, f32 radianY, f32 radianZ)
740{
741 dst = quaternion;
742 dst.mulRotateXZY(radianX, radianY, radianZ);
743
744 return dst;
745}
746
747//---------------------------------------------------------------------------
748// YXZ軸回転乗算を取得
755//---------------------------------------------------------------------------
756GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateYXZ(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radianX, f32 radianY, f32 radianZ)
757{
758 dst = quaternion;
759 dst.mulRotateYXZ(radianX, radianY, radianZ);
760
761 return dst;
762}
763
764//---------------------------------------------------------------------------
765// YZX軸回転乗算を取得
772//---------------------------------------------------------------------------
773GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateYZX(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radianX, f32 radianY, f32 radianZ)
774{
775 dst = quaternion;
776 dst.mulRotateYZX(radianX, radianY, radianZ);
777
778 return dst;
779}
780
781//---------------------------------------------------------------------------
782// ZXY軸回転乗算を取得
789//---------------------------------------------------------------------------
790GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateZXY(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radianX, f32 radianY, f32 radianZ)
791{
792 dst = quaternion;
793 dst.mulRotateZXY(radianX, radianY, radianZ);
794
795 return dst;
796}
797
798//---------------------------------------------------------------------------
799// ZYX軸回転乗算を取得
806//---------------------------------------------------------------------------
807GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getMulRotateZYX(GxQuaternion& dst, const GxQuaternion& quaternion, f32 radianX, f32 radianY, f32 radianZ)
808{
809 dst = quaternion;
810 dst.mulRotateZYX(radianX, radianY, radianZ);
811
812 return dst;
813}
814
815//---------------------------------------------------------------------------
816// 内積を取得
817//---------------------------------------------------------------------------
818GX_FORCE_INLINE f32 GxQuaternion::getDot(const GxQuaternion& quaternion0, const GxQuaternion& quaternion1)
819{
820 return quaternion0._x * quaternion1._x + quaternion0._y * quaternion1._y + quaternion0._z * quaternion1._z + quaternion0._w * quaternion1._w;
821}
822
823//---------------------------------------------------------------------------
824// 線形補間を取得
825//---------------------------------------------------------------------------
826GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getLerp(GxQuaternion& dst, const GxQuaternion& quaternion0, const GxQuaternion& quaternion1, f32 t)
827{
828 dst._x = quaternion0._x + (quaternion1._x - quaternion0._x) * t;
829 dst._y = quaternion0._y + (quaternion1._y - quaternion0._y) * t;
830 dst._z = quaternion0._z + (quaternion1._z - quaternion0._z) * t;
831 dst._w = quaternion0._w + (quaternion1._w - quaternion0._w) * t;
832
833 return dst;
834}
835
836//---------------------------------------------------------------------------
837// 球面線形補間を取得
838//---------------------------------------------------------------------------
839GX_FORCE_INLINE const GxQuaternion& GxQuaternion::getSphericalLerp(GxQuaternion& dst, const GxQuaternion& quaternion0, const GxQuaternion& quaternion1, f32 t)
840{
841 // TODO:
842 GxQuaternion quaternion[2] = { quaternion0, quaternion1 };
843 auto dot = GxQuaternion::getDot(quaternion[0], quaternion[1]);
844 if( dot < 0.0f ) {
845 dot = -dot;
846 quaternion[0] = quaternion[0] * -1.0f;
847 }
848
849 if( dot >= 1.0f - FLT_EPSILON )
850 {
851 // ほぼ等しい
852 return getLerp(dst, quaternion[0], quaternion[1], t);
853 }
854
855 // 球面線形補間を行う
856 const auto angle = GxMath::getACos(dot);
857 const auto rotationInverse = 1.0f / GxMath::getSin(angle);
858 const auto rotationFrom = GxMath::getSin(angle * (1.0f - t));
859 const auto rotationTo = GxMath::getSin(angle * t);
860
861 dst._x = (quaternion[0]._x * rotationFrom + quaternion[1]._x * rotationTo) * rotationInverse;
862 dst._y = (quaternion[0]._y * rotationFrom + quaternion[1]._y * rotationTo) * rotationInverse;
863 dst._z = (quaternion[0]._z * rotationFrom + quaternion[1]._z * rotationTo) * rotationInverse;
864 dst._w = (quaternion[0]._w * rotationFrom + quaternion[1]._w * rotationTo) * rotationInverse;
865
866 return dst;
867}
868
869//---------------------------------------------------------------------------
870// スカラ加算
873//---------------------------------------------------------------------------
874GX_FORCE_INLINE const GxQuaternion& GxQuaternion::addScalar(f32 scalar)
875{
876 _x += scalar;
877 _y += scalar;
878 _z += scalar;
879 _w += scalar;
880
881 return *this;
882}
883
884//---------------------------------------------------------------------------
885// スカラ減算
888//---------------------------------------------------------------------------
889GX_FORCE_INLINE const GxQuaternion& GxQuaternion::subScalar(f32 scalar)
890{
891 _x -= scalar;
892 _y -= scalar;
893 _z -= scalar;
894 _w -= scalar;
895
896 return *this;
897}
898
899//---------------------------------------------------------------------------
900// スカラ乗算
903//---------------------------------------------------------------------------
904GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulScalar(f32 scalar)
905{
906 _x *= scalar;
907 _y *= scalar;
908 _z *= scalar;
909 _w *= scalar;
910
911 return *this;
912}
913
914//---------------------------------------------------------------------------
915// スカラ除算
918//---------------------------------------------------------------------------
919GX_FORCE_INLINE const GxQuaternion& GxQuaternion::divScalar(f32 scalar)
920{
921 auto invScalar = 1.0f / scalar;
922
923 _x *= invScalar;
924 _y *= invScalar;
925 _z *= invScalar;
926 _w *= invScalar;
927
928 return *this;
929}
930
931//---------------------------------------------------------------------------
932// クォータニオン加算
935//---------------------------------------------------------------------------
936GX_FORCE_INLINE const GxQuaternion& GxQuaternion::addQuaternion(const GxQuaternion& quaternion)
937{
938 _x += quaternion._x;
939 _y += quaternion._y;
940 _z += quaternion._z;
941 _w += quaternion._w;
942
943 return *this;
944}
945
946//---------------------------------------------------------------------------
947// クォータニオン減算
950//---------------------------------------------------------------------------
951GX_FORCE_INLINE const GxQuaternion& GxQuaternion::subQuaternion(const GxQuaternion& quaternion)
952{
953 _x -= quaternion._x;
954 _y -= quaternion._y;
955 _z -= quaternion._z;
956 _w -= quaternion._w;
957
958 return *this;
959}
960
961//---------------------------------------------------------------------------
962// クォータニオン乗算
965//---------------------------------------------------------------------------
966GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulQuaternion(const GxQuaternion& quaternion)
967{
968 const auto x = _y * quaternion._z - _z * quaternion._y + _w * quaternion._x + _x * quaternion._w;
969 const auto y = _z * quaternion._x - _x * quaternion._z + _w * quaternion._y + _y * quaternion._w;
970 const auto z = _x * quaternion._y - _y * quaternion._x + _w * quaternion._z + _z * quaternion._w;
971 const auto w = _w * quaternion._w - _x * quaternion._x - _y * quaternion._y - _z * quaternion._z;
972
973 _x = x;
974 _y = y;
975 _z = z;
976 _w = w;
977
978 return *this;
979}
980
981//---------------------------------------------------------------------------
982// 正規化する
985//---------------------------------------------------------------------------
986GX_FORCE_INLINE const GxQuaternion& GxQuaternion::normalize(void)
987{
988 const auto inverseLength = 1.0f / getLength();
989
990 _x *= inverseLength;
991 _y *= inverseLength;
992 _z *= inverseLength;
993 _w *= inverseLength;
994
995 return *this;
996}
997
998//---------------------------------------------------------------------------
999// 正規化する(長さ0に対応)
1002//---------------------------------------------------------------------------
1003GX_FORCE_INLINE const GxQuaternion& GxQuaternion::normalizeEx(void)
1004{
1005 const auto lengthSquare = getLengthSquare();
1006
1007 if( F32_ABS_MIN < lengthSquare )
1008 {
1009 const auto inverseLength = 1.0f / GxMath::getSqrt(lengthSquare);
1010
1011 _x *= inverseLength;
1012 _y *= inverseLength;
1013 _z *= inverseLength;
1014 _w *= inverseLength;
1015 }
1016 else
1017 {
1018 _x = 0.0f;
1019 _y = 0.0f;
1020 _z = 0.0f;
1021 _w = 0.0f;
1022 }
1023
1024 return *this;
1025}
1026
1027//---------------------------------------------------------------------------
1028// 共役クォータニオンを計算
1031//---------------------------------------------------------------------------
1032GX_FORCE_INLINE const GxQuaternion& GxQuaternion::conjugate(void)
1033{
1034 _x = -_x;
1035 _y = -_y;
1036 _z = -_z;
1037
1038 return *this;
1039}
1040
1041//---------------------------------------------------------------------------
1042// 逆クォータニオンを計算
1044//---------------------------------------------------------------------------
1045GX_FORCE_INLINE const GxQuaternion& GxQuaternion::inverse(void)
1046{
1047 auto lengthSquare = getLengthSquare();
1048 if(lengthSquare <= F32_ABS_MIN )
1049 {
1050 _x = 0.0f;
1051 _y = 0.0f;
1052 _z = 0.0f;
1053 _w = 0.0f;
1054 }
1055 else
1056 {
1057 f32 inverseLengthSquare = 1.0f / lengthSquare;
1058 _x = -_x * inverseLengthSquare;
1059 _y = -_y * inverseLengthSquare;
1060 _z = -_z * inverseLengthSquare;
1061 _w = _w * inverseLengthSquare;
1062 }
1063
1064 return *this;
1065}
1066
1067//---------------------------------------------------------------------------
1068// X軸回転乗算
1071//---------------------------------------------------------------------------
1072GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateX(f32 radian)
1073{
1074 GxQuaternion temporary;
1075 temporary.setRotateX(radian);
1076
1077 return mulQuaternion(temporary);
1078}
1079
1080//---------------------------------------------------------------------------
1081// Y軸回転乗算
1084//---------------------------------------------------------------------------
1085GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateY(f32 radian)
1086{
1087 GxQuaternion temporary;
1088 temporary.setRotateY(radian);
1089
1090 return mulQuaternion(temporary);
1091}
1092
1093//---------------------------------------------------------------------------
1094// Z軸回転乗算
1097//---------------------------------------------------------------------------
1098GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateZ(f32 radian)
1099{
1100 GxQuaternion temporary;
1101 temporary.setRotateZ(radian);
1102
1103 return mulQuaternion(temporary);
1104}
1105
1106//---------------------------------------------------------------------------
1107// XYZ軸回転乗算
1112//---------------------------------------------------------------------------
1113GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateXYZ(f32 radianX, f32 radianY, f32 radianZ)
1114{
1115 GxQuaternion temporary;
1116 temporary.setRotateXYZ(radianX, radianY, radianZ);
1117
1118 return mulQuaternion(temporary);
1119}
1120
1121//---------------------------------------------------------------------------
1122// XZY軸回転乗算
1127//---------------------------------------------------------------------------
1128GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateXZY(f32 radianX, f32 radianY, f32 radianZ)
1129{
1130 GxQuaternion temporary;
1131 temporary.setRotateXZY(radianX, radianY, radianZ);
1132
1133 return mulQuaternion(temporary);
1134}
1135
1136//---------------------------------------------------------------------------
1137// YXZ軸回転乗算
1142//---------------------------------------------------------------------------
1143GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateYXZ(f32 radianX, f32 radianY, f32 radianZ)
1144{
1145 GxQuaternion temporary;
1146 temporary.setRotateYXZ(radianX, radianY, radianZ);
1147
1148 return mulQuaternion(temporary);
1149}
1150
1151//---------------------------------------------------------------------------
1152// YZX軸回転乗算
1157//---------------------------------------------------------------------------
1158GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateYZX(f32 radianX, f32 radianY, f32 radianZ)
1159{
1160 GxQuaternion temporary;
1161 temporary.setRotateYZX(radianX, radianY, radianZ);
1162
1163 return mulQuaternion(temporary);
1164}
1165
1166//---------------------------------------------------------------------------
1167// ZXY軸回転乗算
1172//---------------------------------------------------------------------------
1173GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateZXY(f32 radianX, f32 radianY, f32 radianZ)
1174{
1175 GxQuaternion temporary;
1176 temporary.setRotateZXY(radianX, radianY, radianZ);
1177
1178 return mulQuaternion(temporary);
1179}
1180
1181//---------------------------------------------------------------------------
1182// ZYX軸回転乗算
1187//---------------------------------------------------------------------------
1188GX_FORCE_INLINE const GxQuaternion& GxQuaternion::mulRotateZYX(f32 radianX, f32 radianY, f32 radianZ)
1189{
1190 GxQuaternion temporary;
1191 temporary.setRotateZYX(radianX, radianY, radianZ);
1192
1193 return mulQuaternion(temporary);
1194}
1195
1196GX_CORE_NAMESPACE_END()
GX_FORCE_INLINE const GxQuaternion operator-(const GxQuaternion &quaternion, f32 scalar)
Definition GxQuaternion.inl:220
GX_FORCE_INLINE b32 operator==(const GxQuaternion &quaternion0, const GxQuaternion &quaternion1)
Definition GxQuaternion.inl:304
GX_FORCE_INLINE const GxQuaternion operator+(const GxQuaternion &quaternion, f32 scalar)
Definition GxQuaternion.inl:208
GX_FORCE_INLINE const GxQuaternion operator/(const GxQuaternion &quaternion, f32 scalar)
Definition GxQuaternion.inl:256
GX_FORCE_INLINE b32 operator!=(const GxQuaternion &quaternion0, const GxQuaternion &quaternion1)
Definition GxQuaternion.inl:315
GX_FORCE_INLINE const GxQuaternion operator*(const GxQuaternion &quaternion, f32 scalar)
Definition GxQuaternion.inl:232
static GX_FORCE_INLINE f32 getCos(const f32 radian)
余弦を取得(f32)
Definition GxMath.h:212
static GX_FORCE_INLINE f32 getACos(const f32 value)
逆余弦を取得(f32)
Definition GxMath.h:233
static GX_FORCE_INLINE f32 getSqrt(const f32 value)
平方根を取得(f32)
Definition GxMath.h:259
static GX_FORCE_INLINE f32 getSin(const f32 radian)
正弦を取得(f32)
Definition GxMath.h:205
4次元浮動小数点数クラス
Definition GxStruct.h:153
4×4行列(行優先)
Definition GxMatrix.h:607
アフィン変換行列(行優先)
Definition GxMatrix.h:330
クォータニオン
Definition GxQuaternion.h:19
static GX_FORCE_INLINE const GxQuaternion & getSubQuaternion(GxQuaternion &dst, const GxQuaternion &quaternion0, const GxQuaternion &quaternion1)
クォータニオン減算を取得
Definition GxQuaternion.inl:549
GX_FORCE_INLINE const GxQuaternion & mulScalar(f32 scalar)
スカラ乗算
Definition GxQuaternion.inl:904
static GX_FORCE_INLINE const GxQuaternion & getMulRotateZYX(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radianX, f32 radianY, f32 radianZ)
ZYX軸回転乗算を取得
Definition GxQuaternion.inl:807
GX_FORCE_INLINE GxQuaternion & operator/=(f32 scalar)
スカラ除算代入
Definition GxQuaternion.inl:163
GX_FORCE_INLINE void setRotateXZY(f32 x, f32 y, f32 z)
XZY軸回転を設定
Definition GxQuaternion.h:157
GX_FORCE_INLINE f32 getLength(void) const
長さを取得
Definition GxQuaternion.inl:324
static GX_FORCE_INLINE const GxQuaternion & getMulRotateX(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radian)
X軸回転乗算を取得
Definition GxQuaternion.inl:675
GX_FORCE_INLINE const GxQuaternion & divScalar(f32 scalar)
スカラ除算
Definition GxQuaternion.inl:919
GX_FORCE_INLINE const GxQuaternion & mulRotateYXZ(f32 radianX, f32 radianY, f32 radianZ)
YXZ軸回転乗算
Definition GxQuaternion.inl:1143
GX_FORCE_INLINE const GxQuaternion & mulRotateZYX(f32 radianX, f32 radianY, f32 radianZ)
ZYX軸回転乗算
Definition GxQuaternion.inl:1188
static GX_FORCE_INLINE const GxQuaternion & getMulRotateXYZ(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radianX, f32 radianY, f32 radianZ)
XYZ軸回転乗算を取得
Definition GxQuaternion.inl:722
static GX_FORCE_INLINE f32 getDot(const GxQuaternion &quaternion0, const GxQuaternion &quaternion1)
内積を取得
Definition GxQuaternion.inl:818
GX_FORCE_INLINE const GxQuaternion & mulRotateXYZ(f32 radianX, f32 radianY, f32 radianZ)
XYZ軸回転乗算
Definition GxQuaternion.inl:1113
static GX_FORCE_INLINE const GxQuaternion & getSphericalLerp(GxQuaternion &dst, const GxQuaternion &quaternion0, const GxQuaternion &quaternion1, f32 t)
球面線形補間を取得
Definition GxQuaternion.inl:839
GX_FORCE_INLINE void setRotateZ(f32 radian)
Z軸回転を設定
Definition GxQuaternion.inl:446
GX_FORCE_INLINE const GxQuaternion & mulRotateXZY(f32 radianX, f32 radianY, f32 radianZ)
XZY軸回転乗算
Definition GxQuaternion.inl:1128
static GX_FORCE_INLINE const GxQuaternion & getMulRotateZXY(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radianX, f32 radianY, f32 radianZ)
ZXY軸回転乗算を取得
Definition GxQuaternion.inl:790
GX_FORCE_INLINE GxQuaternion getConjugate(void) const
共役クォータニオンを取得
Definition GxQuaternion.inl:385
GX_FORCE_INLINE const GxQuaternion & conjugate(void)
共役クォータニオンを計算する
Definition GxQuaternion.inl:1032
f32 _x
X値
Definition GxQuaternion.h:272
static GX_FORCE_INLINE const GxQuaternion & getMulRotateYZX(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radianX, f32 radianY, f32 radianZ)
YZX軸回転乗算を取得
Definition GxQuaternion.inl:773
static GX_FORCE_INLINE const GxQuaternion & getAddScalar(GxQuaternion &dst, const GxQuaternion &quaternion, f32 scalar)
スカラ加算を取得
Definition GxQuaternion.inl:462
static GX_FORCE_INLINE const GxQuaternion & getAddQuaternion(GxQuaternion &dst, const GxQuaternion &quaternion0, const GxQuaternion &quaternion1)
クォータニオン加算を取得
Definition GxQuaternion.inl:532
GX_FORCE_INLINE GxQuaternion & operator-=(f32 scalar)
スカラ減算代入
Definition GxQuaternion.inl:141
static GX_FORCE_INLINE const GxQuaternion & getMulScalar(GxQuaternion &dst, const GxQuaternion &quaternion, f32 scalar)
スカラ乗算を取得
Definition GxQuaternion.inl:496
GX_FORCE_INLINE GxQuaternion & operator=(const GxQuaternion &quaternion)
代入
Definition GxQuaternion.inl:116
GX_FORCE_INLINE void setRotateZXY(f32 x, f32 y, f32 z)
ZXY軸回転を設定
Definition GxQuaternion.h:163
GX_FORCE_INLINE const GxQuaternion & addQuaternion(const GxQuaternion &quaternion)
クォータニオン加算
Definition GxQuaternion.inl:936
static GX_FORCE_INLINE const GxQuaternion & getSubScalar(GxQuaternion &dst, const GxQuaternion &quaternion, f32 scalar)
スカラ減算を取得
Definition GxQuaternion.inl:479
static const GxQuaternion ZERO
0クォータニオン
Definition GxQuaternion.h:28
GX_FORCE_INLINE GxQuaternion getNormalize(void) const
正規化クォータニオンを取得
Definition GxQuaternion.inl:342
f32 _w
W値
Definition GxQuaternion.h:275
GX_FORCE_INLINE GxQuaternion & operator+=(f32 scalar)
スカラ加算代入
Definition GxQuaternion.inl:130
static GX_FORCE_INLINE const GxQuaternion & getMulQuaternion(GxQuaternion &dst, const GxQuaternion &quaternion0, const GxQuaternion &quaternion1)
クォータニオン乗算を取得
Definition GxQuaternion.inl:566
GX_FORCE_INLINE f32 getLengthSquare(void) const
長さの2乗を取得
Definition GxQuaternion.inl:333
GX_FORCE_INLINE void setRotateXYZ(f32 x, f32 y, f32 z)
XYZ軸回転を設定
Definition GxQuaternion.h:155
GX_FORCE_INLINE GxQuaternion & operator*=(f32 scalar)
スカラ乗算代入
Definition GxQuaternion.inl:152
GX_FORCE_INLINE const GxQuaternion & normalizeEx(void)
正規化する(長さ0に対応)
Definition GxQuaternion.inl:1003
GX_FORCE_INLINE const GxQuaternion & mulRotateZ(f32 radian)
Z軸回転乗算
Definition GxQuaternion.inl:1098
static GX_FORCE_INLINE const GxQuaternion & getDivScalar(GxQuaternion &dst, const GxQuaternion &quaternion, f32 scalar)
スカラ除算を取得
Definition GxQuaternion.inl:513
static GX_FORCE_INLINE const GxQuaternion & getMulRotateYXZ(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radianX, f32 radianY, f32 radianZ)
YXZ軸回転乗算を取得
Definition GxQuaternion.inl:756
GX_FORCE_INLINE const GxQuaternion & mulRotateY(f32 radian)
Y軸回転乗算
Definition GxQuaternion.inl:1085
GX_FORCE_INLINE void setRotateY(f32 radian)
Y軸回転を設定
Definition GxQuaternion.inl:433
GX_FORCE_INLINE const GxQuaternion & addScalar(f32 scalar)
スカラ加算
Definition GxQuaternion.inl:874
GX_FORCE_INLINE const GxQuaternion & mulRotateX(f32 radian)
X軸回転乗算
Definition GxQuaternion.inl:1072
GX_FORCE_INLINE void setRotateYXZ(f32 x, f32 y, f32 z)
YXZ軸回転を設定
Definition GxQuaternion.h:159
GX_FORCE_INLINE void setRotate(const GxVector3 &vector)
回転を設定(ベクトル指定)
Definition GxQuaternion.inl:411
static GX_FORCE_INLINE const GxQuaternion & getMulRotateZ(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radian)
Z軸回転乗算を取得
Definition GxQuaternion.inl:705
GX_FORCE_INLINE const GxQuaternion & normalize(void)
正規化する
Definition GxQuaternion.inl:986
GX_FORCE_INLINE void setRotateX(f32 radian)
X軸回転を設定
Definition GxQuaternion.inl:420
f32 _y
Y値
Definition GxQuaternion.h:273
GX_FORCE_INLINE void setRotateZYX(f32 x, f32 y, f32 z)
ZYX軸回転を設定
Definition GxQuaternion.h:165
static GX_FORCE_INLINE const GxQuaternion & getMulRotateXZY(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radianX, f32 radianY, f32 radianZ)
XZY軸回転乗算を取得
Definition GxQuaternion.inl:739
static GX_FORCE_INLINE const GxQuaternion & getLerp(GxQuaternion &dst, const GxQuaternion &quaternion0, const GxQuaternion &quaternion1, f32 t)
線形補間を取得
Definition GxQuaternion.inl:826
GxQuaternion(void)
デフォルトコンストラクタ
Definition GxQuaternion.h:38
GX_FORCE_INLINE const GxQuaternion & mulQuaternion(const GxQuaternion &quaternion)
クォータニオン乗算
Definition GxQuaternion.inl:966
GX_FORCE_INLINE void setRotateYZX(f32 x, f32 y, f32 z)
YZX軸回転を設定
Definition GxQuaternion.h:161
f32 _z
Z値
Definition GxQuaternion.h:274
GX_FORCE_INLINE const GxQuaternion & subScalar(f32 scalar)
スカラ減算
Definition GxQuaternion.inl:889
GX_FORCE_INLINE const GxQuaternion & mulRotateZXY(f32 radianX, f32 radianY, f32 radianZ)
ZXY軸回転乗算
Definition GxQuaternion.inl:1173
GX_FORCE_INLINE const GxQuaternion & subQuaternion(const GxQuaternion &quaternion)
クォータニオン減算
Definition GxQuaternion.inl:951
GX_FORCE_INLINE GxQuaternion getNormalizeEx(void) const
正規化クォータニオンを取得(長さ0に対応)
Definition GxQuaternion.inl:357
GX_FORCE_INLINE const GxQuaternion & mulRotateYZX(f32 radianX, f32 radianY, f32 radianZ)
YZX軸回転乗算
Definition GxQuaternion.inl:1158
GX_FORCE_INLINE const GxQuaternion & inverse(void)
逆クォータニオンを計算する
Definition GxQuaternion.inl:1045
GX_FORCE_INLINE GxQuaternion getInverse(void) const
逆クォータニオンを取得
Definition GxQuaternion.inl:394
static GX_FORCE_INLINE const GxQuaternion & getMulRotateY(GxQuaternion &dst, const GxQuaternion &quaternion, f32 radian)
Y軸回転乗算を取得
Definition GxQuaternion.inl:690
3次元ベクトル
Definition GxVector.h:245
f32 _z
Z値
Definition GxVector.h:572
f32 _y
Y値
Definition GxVector.h:571
f32 _x
X値
Definition GxVector.h:570
4次元ベクトル
Definition GxVector.h:582
32bitブーリアン
Definition GxDefine.h:173