UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Rotator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
6#include "Math/MathFwd.h" // IWYU pragma: export
9#include "Misc/Parse.h"
11#include "Logging/LogMacros.h"
12#include "Math/Vector.h"
13#include "Math/VectorRegister.h"
15
16namespace UE
17{
18namespace Math
19{
20
35template<typename T>
37{
38
39 // Can't have a UE_REQUIRES in the declaration because of the forward declarations, so check for allowed types here.
40 static_assert(std::is_floating_point_v<T>, "TRotator only supports float and double types.");
41
42public:
43 using FReal = T;
44
47
49 T Yaw;
50
53
54public:
55
58
59public:
60
61#if ENABLE_NAN_DIAGNOSTIC
62 inline void DiagnosticCheckNaN() const
63 {
64 if (ContainsNaN())
65 {
66 logOrEnsureNanError(TEXT("TRotator contains NaN: %s"), *ToString());
67 *const_cast<TRotator<T>*>(this) = ZeroRotator;
68 }
69 }
70
71 inline void DiagnosticCheckNaN(const TCHAR* Message) const
72 {
73 if (ContainsNaN())
74 {
75 logOrEnsureNanError(TEXT("%s: TRotator contains NaN: %s"), Message, *ToString());
76 *const_cast<TRotator<T>*>(this) = ZeroRotator;
77 }
78 }
79#else
81 UE_FORCEINLINE_HINT void DiagnosticCheckNaN(const TCHAR* Message) const {}
82#endif
83
87 [[nodiscard]] TRotator() = default;
88
95
104
111
117[[nodiscard]] explicit CORE_API TRotator( const TQuat<T>& Quat );
118
119public:
120
121 // Binary arithmetic operators.
122
130
138
145 template<typename FArg UE_REQUIRES(std::is_arithmetic_v<FArg>)>
150
157 template<typename FArg UE_REQUIRES(std::is_arithmetic_v<FArg>)>
159 {
160 Pitch = Pitch * Scale; Yaw = Yaw * Scale; Roll = Roll * Scale;
162 return *this;
163 }
164
165 // Binary comparison operators.
166
174 [[nodiscard]] bool operator==( const TRotator<T>& R ) const;
175
182 [[nodiscard]] bool operator!=( const TRotator<T>& V ) const;
183
184 // Assignment operators.
185
193
201
202public:
203
204 // Functions.
205
213 [[nodiscard]] bool IsNearlyZero( T Tolerance = UE_KINDA_SMALL_NUMBER ) const;
214
221 [[nodiscard]] bool IsZero() const;
222
234 [[nodiscard]] bool Equals( const TRotator<T>& R, T Tolerance = UE_KINDA_SMALL_NUMBER ) const;
235
248 [[nodiscard]] bool EqualsOrientation( const TRotator<T>& R, T Tolerance = UE_KINDA_SMALL_NUMBER ) const;
249
259
264
272
279
286
293
301
309
316
323
330
333
336
340 void Normalize();
341
350
357
364
373
379 [[nodiscard]] FString ToString() const;
380
382 [[nodiscard]] FString ToCompactString() const;
383
391 bool InitFromString( const FString& InSourceString );
392
398 [[nodiscard]] bool ContainsNaN() const;
399
406
413
416 CORE_API bool NetSerialize( FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess );
417
418public:
419
426 [[nodiscard]] static T ClampAxis( T Angle );
427
434 [[nodiscard]] static T NormalizeAxis( T Angle );
435
443
451
459
467
475
476
477public:
478
479 bool Serialize( FArchive& Ar )
480 {
481 Ar << *this;
482 return true;
483 }
484
486 {
487 if constexpr (std::is_same_v<T, float>)
488 {
489 return UE_SERIALIZE_VARIANT_FROM_MISMATCHED_TAG(Ar, Rotator, Rotator3f, Rotator3d);
490 }
491 else
492 {
493 return UE_SERIALIZE_VARIANT_FROM_MISMATCHED_TAG(Ar, Rotator, Rotator3d, Rotator3f);
494 }
495 }
496
497 // Conversion from other type.
498 template<typename FArg UE_REQUIRES(!std::is_same_v<T, FArg>)>
499 explicit TRotator(const TRotator<FArg>& From)
500 : TRotator<T>((T)From.Pitch, (T)From.Yaw, (T)From.Roll)
501 {
502 }
503};
504
505#if !defined(_MSC_VER) || defined(__clang__) // MSVC can't forward declare explicit specializations
508#endif
509
510/* TRotator inline functions
511 *****************************************************************************/
512
522{
523 Ar << R.Pitch << R.Yaw << R.Roll;
524 return Ar;
525}
526
528{
530 {
531 Ar << R.Pitch << R.Yaw << R.Roll;
532 }
533 else
534 {
535 checkf(Ar.IsLoading(), TEXT("float -> double conversion applied outside of load!"));
536 // Stored as floats, so serialize float and copy.
537 float Pitch, Yaw, Roll;
538 Ar << Pitch << Yaw << Roll;
539 R = TRotator<double>(Pitch, Yaw, Roll);
540 }
541 return Ar;
542}
543
544/* FRotator inline functions
545 *****************************************************************************/
546
554template<typename T, typename FArg UE_REQUIRES(std::is_arithmetic_v<FArg>)>
556{
557 return R.operator*( Scale );
558}
559
560template<typename T>
562 : Pitch(InF), Yaw(InF), Roll(InF)
563{
565}
566
567template<typename T>
569 : Pitch(InPitch), Yaw(InYaw), Roll(InRoll)
570{
572}
573
574template<typename T>
578
579template<typename T>
581{
582 return TRotator( Pitch+R.Pitch, Yaw+R.Yaw, Roll+R.Roll );
583}
584
585template<typename T>
587{
588 return TRotator( Pitch-R.Pitch, Yaw-R.Yaw, Roll-R.Roll );
589}
590
591template<typename T>
593{
594 return Pitch==R.Pitch && Yaw==R.Yaw && Roll==R.Roll;
595}
596
597template<typename T>
599{
600 return Pitch!=V.Pitch || Yaw!=V.Yaw || Roll!=V.Roll;
601}
602
603template<typename T>
605{
606 Pitch += R.Pitch; Yaw += R.Yaw; Roll += R.Roll;
607 DiagnosticCheckNaN();
608 return *this;
609}
610
611template<typename T>
613{
614 Pitch -= R.Pitch; Yaw -= R.Yaw; Roll -= R.Roll;
615 DiagnosticCheckNaN();
616 return *this;
617}
618
619template<typename T>
620inline bool TRotator<T>::IsNearlyZero(T Tolerance) const
621{
622#if PLATFORM_ENABLE_VECTORINTRINSICS
626 return !VectorAnyGreaterThan(AbsNorm, VectorLoadFloat1(&Tolerance));
627#else
628 return
629 FMath::Abs(NormalizeAxis(Pitch))<=Tolerance
630 && FMath::Abs(NormalizeAxis(Yaw))<=Tolerance
631 && FMath::Abs(NormalizeAxis(Roll))<=Tolerance;
632#endif
633}
634
635template<typename T>
637{
638 return (ClampAxis(Pitch)==0.f) && (ClampAxis(Yaw)==0.f) && (ClampAxis(Roll)==0.f);
639}
640
641template<typename T>
642inline bool TRotator<T>::Equals(const TRotator<T>& R, T Tolerance) const
643{
644#if PLATFORM_ENABLE_VECTORINTRINSICS
650#else
651 return (FMath::Abs(NormalizeAxis(Pitch - R.Pitch)) <= Tolerance)
652 && (FMath::Abs(NormalizeAxis(Yaw - R.Yaw)) <= Tolerance)
653 && (FMath::Abs(NormalizeAxis(Roll - R.Roll)) <= Tolerance);
654#endif
655}
656
657template <typename T>
658bool TRotator<T>::EqualsOrientation(const TRotator<T>& R, T Tolerance) const
659{
660 return Quaternion().AngularDistance(R.Quaternion()) <= Tolerance;
661}
662
663template<typename T>
665{
666 Yaw += DeltaYaw;
667 Pitch += DeltaPitch;
668 Roll += DeltaRoll;
669 DiagnosticCheckNaN();
670 return *this;
671}
672
673template<typename T>
675{
676 return TRotator
677 (
679 FMath::GridSnap(Yaw, RotGrid.Yaw),
680 FMath::GridSnap(Roll, RotGrid.Roll)
681 );
682}
683
684template<typename T>
686{
687 return TRotator(ClampAxis(Pitch), ClampAxis(Yaw), ClampAxis(Roll));
688}
689
690template<typename T>
692{
693 // returns Angle in the range (-360,360)
694 Angle = FMath::Fmod(Angle, (T)360.0);
695
696 if (Angle < (T)0.0)
697 {
698 // shift to [0,360) range
699 Angle += (T)360.0;
700 }
701
702 return Angle;
703}
704
705template<typename T>
707{
708 // returns Angle in the range [0,360)
709 Angle = ClampAxis(Angle);
710
711 if (Angle > (T)180.0)
712 {
713 // shift to (-180,180]
714 Angle -= (T)360.0;
715 }
716
717 return Angle;
718}
719
720template<typename T>
722{
723 // map [0->360) to [0->256) and mask off any winding
724 return FMath::RoundToInt(Angle * (T)256.f / (T)360.f) & 0xFF;
725}
726
727template<typename T>
729{
730 // map [0->256) to [0->360)
731 return (Angle * (T)360.f / (T)256.f);
732}
733
734template<typename T>
736{
737 // map [0->360) to [0->65536) and mask off any winding
738 return FMath::RoundToInt(Angle * (T)65536.f / (T)360.f) & 0xFFFF;
739}
740
741template<typename T>
743{
744 // map [0->65536) to [0->360)
745 return (Angle * (T)360.f / (T)65536.f);
746}
747
748template<typename T>
750{
751 TRotator Rot = *this;
752 Rot.Normalize();
753 return Rot;
754}
755
756template<typename T>
758{
759 TRotator Rot = *this;
760 Rot.Pitch = ClampAxis(Rot.Pitch);
761 Rot.Yaw = ClampAxis(Rot.Yaw);
762 Rot.Roll = ClampAxis(Rot.Roll);
763 return Rot;
764}
765
766template<typename T>
768{
769#if PLATFORM_ENABLE_VECTORINTRINSICS
773#else
774 Pitch = NormalizeAxis(Pitch);
775 Yaw = NormalizeAxis(Yaw);
776 Roll = NormalizeAxis(Roll);
777#endif
778 DiagnosticCheckNaN();
779}
780
781template<typename T>
783{
784 switch (Axis)
785 {
786 case EAxis::X:
787 return Roll;
788 case EAxis::Y:
789 return Pitch;
790 case EAxis::Z:
791 return Yaw;
792 case EAxis::None:
793 default:
794 return 0.f;
795 }
796}
797
798template<typename T>
800{
801 switch (Axis)
802 {
803 case EAxis::X:
804 Roll = Component;
805 break;
806 case EAxis::Y:
808 break;
809 case EAxis::Z:
810 Yaw = Component;
811 break;
812 case EAxis::None:
813 default:
814 break;
815 }
816}
817
818template<typename T>
820{
821 return FString::Printf(TEXT("P=%f Y=%f R=%f"), Pitch, Yaw, Roll );
822}
823
824template<typename T>
825inline FString TRotator<T>::ToCompactString() const
826{
827 if( IsNearlyZero() )
828 {
829 return FString(TEXT("R(0)"));
830 }
831
832 FString ReturnString(TEXT("R("));
833 bool bIsEmptyString = true;
835 {
836 ReturnString += FString::Printf(TEXT("P=%.2f"), Pitch);
837 bIsEmptyString = false;
838 }
839 if( !FMath::IsNearlyZero(Yaw) )
840 {
841 if( !bIsEmptyString )
842 {
843 ReturnString += FString(TEXT(", "));
844 }
845 ReturnString += FString::Printf(TEXT("Y=%.2f"), Yaw);
846 bIsEmptyString = false;
847 }
848 if( !FMath::IsNearlyZero(Roll) )
849 {
850 if( !bIsEmptyString )
851 {
852 ReturnString += FString(TEXT(", "));
853 }
854 ReturnString += FString::Printf(TEXT("R=%.2f"), Roll);
855 bIsEmptyString = false;
856 }
857 ReturnString += FString(TEXT(")"));
858 return ReturnString;
859}
860
861template<typename T>
862inline bool TRotator<T>::InitFromString( const FString& InSourceString )
863{
864 Pitch = Yaw = Roll = 0;
865
866 // The initialization is only successful if the X, Y, and Z values can all be parsed from the string
867 const bool bSuccessful = FParse::Value( *InSourceString, TEXT("P=") , Pitch ) && FParse::Value( *InSourceString, TEXT("Y="), Yaw ) && FParse::Value( *InSourceString, TEXT("R="), Roll );
868 DiagnosticCheckNaN();
869 return bSuccessful;
870}
871
872template<typename T>
873inline bool TRotator<T>::ContainsNaN() const
874{
875 return (!FMath::IsFinite(Pitch) ||
876 !FMath::IsFinite(Yaw) ||
877 !FMath::IsFinite(Roll));
878}
879
880template<typename T>
882{
883 return FMath::Abs<T>(Yaw - Rotator.Yaw) + FMath::Abs<T>(Pitch - Rotator.Pitch) + FMath::Abs<T>(Roll - Rotator.Roll);
884}
885
886template<typename T>
888{
889 return TRotator(180.0f - Pitch,Yaw + 180.0f, Roll + 180.0f);
890}
891
892template<typename T>
894{
896 T FirstDiff = GetManhattanDistance(MakeClosest);
897 T SecondDiff = GetManhattanDistance(OtherChoice);
898 if (SecondDiff < FirstDiff)
900}
901
902} // namespace UE::Math
903} // namespace UE
904
906
907template<> struct TCanBulkSerialize<FRotator3f> { enum { Value = false }; };
908template<> struct TIsPODType<FRotator3f> { enum { Value = true }; };
909template<> struct TIsUECoreVariant<FRotator3f> { enum { Value = true }; };
911
912template<> struct TCanBulkSerialize<FRotator3d> { enum { Value = false }; };
913template<> struct TIsPODType<FRotator3d> { enum { Value = true }; };
914template<> struct TIsUECoreVariant<FRotator3d> { enum { Value = true }; };
916
917// Forward declare all explicit specializations (in UnrealMath.cpp)
918template<> CORE_API FQuat4f FRotator3f::Quaternion() const;
919template<> CORE_API FQuat4d FRotator3d::Quaternion() const;
920
921
922/* FMath inline functions
923 *****************************************************************************/
924
925template<typename T>
926struct TCustomLerp<UE::Math::TRotator<T>>
927{
928 // Required to make FMath::Lerp<TRotator>() call our custom Lerp() implementation below.
929 constexpr static bool Value = true;
931
932 template<class U>
934 {
935 return A + (B - A).GetNormalized() * Alpha;
936 }
937};
938
939template< typename T, typename U >
941{
942 // Similar to Lerp, but does not take the shortest path. Allows interpolation over more than 180 degrees.
943 return (A * ((T)1.0 - (T)Alpha) + B * Alpha).GetNormalized();
944}
945
946template<typename T>
948{
949 const T MaxDelta = UE::Math::TRotator<T>::ClampAxis(MaxAngleDegrees - MinAngleDegrees) * 0.5f; // 0..180
950 const T RangeCenter = UE::Math::TRotator<T>::ClampAxis(MinAngleDegrees + MaxDelta); // 0..360
952
953 // maybe clamp to nearest edge
954 if (DeltaFromCenter > MaxDelta)
955 {
957 }
958 else if (DeltaFromCenter < -MaxDelta)
959 {
961 }
962
963 // already in range, just return it
965}
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
EForceInit
Definition CoreMiscDefines.h:154
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_SERIALIZE_VARIANT_FROM_MISMATCHED_TAG(AR_OR_SLOT, ALIAS, TYPE, ALT_TYPE)
Definition LargeWorldCoordinatesSerializer.h:9
#define UE_DECLARE_LWC_TYPE(...)
Definition LargeWorldCoordinates.h:27
#define logOrEnsureNanError(_FormatString_,...)
Definition LogMacros.h:436
#define DECLARE_INTRINSIC_TYPE_LAYOUT(T)
Definition MemoryLayout.h:760
FORCEINLINE VectorRegister4Float VectorSubtract(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:731
FORCEINLINE uint32 VectorAnyGreaterThan(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1917
FORCEINLINE VectorRegister4Float VectorLoadFloat1(const float *Ptr)
Definition UnrealMathFPU.h:468
FORCEINLINE VectorRegister4Float VectorAbs(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:661
FORCEINLINE void VectorStoreFloat3(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:594
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
FORCEINLINE VectorRegister4Float VectorNormalizeRotator(VectorRegister4Float UnnormalizedRotator)
Definition UnrealMathVectorCommon.h.inl:628
FORCEINLINE VectorRegister4Float VectorLoadFloat3_W0(const float *Ptr)
VectorLoadFloat3_W0.
Definition UnrealMathVectorCommon.h.inl:129
typename UE::Math::VectorRegisterPrivate::TVectorRegisterTypeHelper< T >::Type TVectorRegisterType
Definition VectorRegister.h:49
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
Definition Archive.h:1208
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
UE_FORCEINLINE_HINT FPackageFileVersion UEVer() const
Definition Archive.h:204
Definition NameTypes.h:617
Definition CoreNet.h:191
Type
Definition Axis.h:11
@ Z
Definition Axis.h:15
@ Y
Definition Axis.h:14
@ X
Definition Axis.h:13
@ None
Definition Axis.h:12
FArchive & operator<<(FArchive &Ar, TBoxSphereBounds< float, float > &Bounds)
Definition BoxSphereBounds.h:396
UE_FORCEINLINE_HINT TQuat< T > operator*(const float Scale, const TQuat< T > &Q)
Definition Quat.h:1055
Definition AdvancedWidgetsModule.cpp:13
static UE::Math::TRotator< T > LerpRange(const UE::Math::TRotator< T > &A, const UE::Math::TRotator< T > &B, U Alpha)
static T ClampAngle(T AngleDegrees, T MinAngleDegrees, T MaxAngleDegrees)
Definition Rotator.h:947
static UE_FORCEINLINE_HINT bool IsNearlyZero(float Value, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:407
static constexpr UE_FORCEINLINE_HINT T GridSnap(T Location, T Grid)
Definition UnrealMathUtility.h:685
static CORE_API bool Value(const TCHAR *Stream, const TCHAR *Match, FName &Name)
Definition Parse.cpp:584
Definition Array.h:45
@ Value
Definition Array.h:46
static UE_FORCEINLINE_HINT RotatorType Lerp(const RotatorType &A, const RotatorType &B, const U &Alpha)
Definition Rotator.h:933
Definition UnrealMathUtility.h:261
static constexpr bool Value
Definition UnrealMathUtility.h:262
Definition IsPODType.h:12
@ Value
Definition IsPODType.h:13
Definition IsUECoreType.h:19
@ Value
Definition IsUECoreType.h:20
Definition Quat.h:39
Definition Rotator.h:37
CORE_API TRotator GetInverse() const
Definition UnrealMath.cpp:406
CORE_API TVector< T > Euler() const
Definition UnrealMath.cpp:553
static T ClampAxis(T Angle)
Definition Rotator.h:691
TRotator operator+=(const TRotator< T > &R)
Definition Rotator.h:604
bool IsNearlyZero(T Tolerance=UE_KINDA_SMALL_NUMBER) const
Definition Rotator.h:620
CORE_API void GetWindingAndRemainder(TRotator< T > &Winding, TRotator< T > &Remainder) const
Definition UnrealMath.cpp:577
bool ContainsNaN() const
Definition Rotator.h:873
T GetComponentForAxis(EAxis::Type Axis) const
Definition Rotator.h:782
FString ToString() const
Definition Rotator.h:819
CORE_API TVector< T > RotateVector(const UE::Math::TVector< T > &V) const
Definition UnrealMath.cpp:571
T Pitch
Definition Rotator.h:46
TRotator< T > GetNormalized() const
Definition Rotator.h:749
static T DecompressAxisFromByte(uint8 Angle)
Definition Rotator.h:728
UE_FORCEINLINE_HINT TRotator(T InPitch, T InYaw, T InRoll)
Definition Rotator.h:568
TRotator operator*=(FArg Scale)
Definition Rotator.h:158
static uint8 CompressAxisToByte(T Angle)
Definition Rotator.h:721
TRotator operator-=(const TRotator< T > &R)
Definition Rotator.h:612
TRotator operator+(const TRotator< T > &R) const
Definition Rotator.h:580
bool InitFromString(const FString &InSourceString)
Definition Rotator.h:862
TRotator Add(T DeltaPitch, T DeltaYaw, T DeltaRoll)
Definition Rotator.h:664
T Yaw
Definition Rotator.h:49
bool Serialize(FArchive &Ar)
Definition Rotator.h:479
bool EqualsOrientation(const TRotator< T > &R, T Tolerance=UE_KINDA_SMALL_NUMBER) const
Definition Rotator.h:658
bool SerializeFromMismatchedTag(FName StructTag, FArchive &Ar)
Definition Rotator.h:485
UE_FORCEINLINE_HINT void DiagnosticCheckNaN() const
Definition Rotator.h:80
UE_FORCEINLINE_HINT TRotator(EForceInit)
Definition Rotator.h:575
CORE_API void SerializeCompressedShort(FArchive &Ar)
Definition UnrealMath.cpp:142
bool operator!=(const TRotator< T > &V) const
Definition Rotator.h:598
T FReal
Definition Rotator.h:43
TRotator< T > GetDenormalized() const
Definition Rotator.h:757
TRotator GridSnap(const TRotator< T > &RotGrid) const
Definition Rotator.h:674
CORE_API TVector< T > UnrotateVector(const UE::Math::TVector< T > &V) const
Definition UnrealMath.cpp:565
CORE_API TVector< T > Vector() const
Definition UnrealMath.cpp:371
TRotator GetEquivalentRotator() const
Definition Rotator.h:887
CORE_API TQuat< T > Quaternion() const
TRotator< T > Clamp() const
Definition Rotator.h:685
static T NormalizeAxis(T Angle)
Definition Rotator.h:706
UE_FORCEINLINE_HINT TRotator operator*(FArg Scale) const
Definition Rotator.h:146
T GetManhattanDistance(const TRotator< T > &Rotator) const
Definition Rotator.h:881
CORE_API void SerializeCompressed(FArchive &Ar)
Definition UnrealMath.cpp:84
UE_FORCEINLINE_HINT TRotator(T InF)
Definition Rotator.h:561
T Roll
Definition Rotator.h:52
static CORE_API const TRotator< T > ZeroRotator
Definition Rotator.h:57
static uint16 CompressAxisToShort(T Angle)
Definition Rotator.h:735
bool Equals(const TRotator< T > &R, T Tolerance=UE_KINDA_SMALL_NUMBER) const
Definition Rotator.h:642
void SetClosestToMe(TRotator &MakeClosest) const
Definition Rotator.h:893
TRotator(const TRotator< FArg > &From)
Definition Rotator.h:499
UE_FORCEINLINE_HINT void DiagnosticCheckNaN(const TCHAR *Message) const
Definition Rotator.h:81
bool operator==(const TRotator< T > &R) const
Definition Rotator.h:592
void Normalize()
Definition Rotator.h:767
CORE_API bool NetSerialize(FArchive &Ar, class UPackageMap *Map, bool &bOutSuccess)
Definition UnrealMath.cpp:76
TRotator operator-(const TRotator< T > &R) const
Definition Rotator.h:586
bool IsZero() const
Definition Rotator.h:636
void SetComponentForAxis(EAxis::Type Axis, T Component)
Definition Rotator.h:799
static CORE_API TRotator MakeFromEuler(const TVector< T > &Euler)
Definition UnrealMath.cpp:559
FString ToCompactString() const
Definition Rotator.h:825
static T DecompressAxisFromShort(uint16 Angle)
Definition Rotator.h:742
Definition Vector.h:51