RapyutaSimulationPlugins
RRCamera.h
Go to the documentation of this file.
1 
13 #pragma once
14 
15 
16 
17 // UE
18 
19 #include "Camera/CameraComponent.h"
20 
21 #include "CoreMinimal.h"
22 
23 
24 
25 // RapyutaSimulationPlugins
26 
27 #include "Core/RRBaseActor.h"
28 
29 #include "Core/RRMathUtils.h"
30 
31 #include "Core/RRUObjectUtils.h"
32 
33 
34 
35 #include "RRCamera.generated.h"
36 
37 
38 
50 struct RAPYUTASIMULATIONPLUGINS_API FRRCameraProperties
51 
52 {
53 
54 
55 
56 
61  FVector2f DistanceRangeInCm = FVector2f(100.f, 300.f);
62 
63 
64 
65 
70  FVector2f HeightRangeInCm = FVector2f(5.f, 100.f);
71 
72 
73 
74 
79  FVector2f HFoVRangeInDegree = FVector2f(80.f, 120.f);
80 
81 
82 
83  FORCEINLINE void PrintSelf() const
84 
85  {
86 
87  UE_LOG_WITH_INFO(LogRapyutaCore, Display, TEXT("CameraProperties:"));
88 
89  UE_LOG_WITH_INFO(LogRapyutaCore, Display, TEXT("- DistanceRangeInCm: %s"), *DistanceRangeInCm.ToString());
90 
91  verify(FMath::IsWithinInclusive(double(DistanceRangeInCm.X), double(0), double(DistanceRangeInCm.Y)));
92 
93  UE_LOG_WITH_INFO(LogRapyutaCore, Display, TEXT("- HeightRangeInCm: %s"), *HeightRangeInCm.ToString());
94 
95  verify(FMath::IsWithinInclusive(double(HeightRangeInCm.X), double(0), double(HeightRangeInCm.Y)));
96 
97  UE_LOG_WITH_INFO(LogRapyutaCore, Display, TEXT("- HFoVRangeInDegree: %s"), *HFoVRangeInDegree.ToString());
98 
99  verify(FMath::IsWithinInclusive(double(HFoVRangeInDegree.X), double(0), double(HFoVRangeInDegree.Y)));
100 
101  }
102 
103 };
104 
105 
106 
118 class RAPYUTASIMULATIONPLUGINS_API ARRCamera : public ARRBaseActor
119 
120 {
121 
122 
123 
124 public:
125 
126  ARRCamera();
127 
128 
129 
130 
135  UCameraComponent* CameraComponent = nullptr;
136 
137 
138 
139 
145 
146 
147 
148  virtual bool Initialize() override;
149 
150  void LookAt(const FVector& InTargetLocation,
151 
152  const FVector& InTargetNormal,
153 
154  const FVector2f& InDistanceRange,
155 
156  const FVector2f& InHeightRange,
157 
158  const FVector2f& InAngleRange,
159 
160  bool bMoveToNearTarget)
161 
162  {
163 
164  if (bMoveToNearTarget)
165 
166  {
167 
168  // In [Target]'s coordinate, rotate XAxis around its ZAxis a random angle in [InAngleRange]
169 
170  FVector randomDelta =
171 
172  FQuat(FVector::ZAxisVector, URRMathUtils::GetRandomFloatInRange(InAngleRange)).RotateVector(FVector::XAxisVector);
173 
174 
175 
176  // Determinate [randomDelta]'s corresponding self of [Target]'s XAxis
177 
178  randomDelta = FQuat::FindBetweenNormals(FVector::XAxisVector, InTargetNormal.GetSafeNormal()).RotateVector(randomDelta);
179 
180 
181 
182  randomDelta *= URRMathUtils::GetRandomFloatInRange(InDistanceRange);
183 
184  randomDelta.Z = URRMathUtils::GetRandomFloatInRange(InHeightRange);
185 
186  SetActorLocation(InTargetLocation + randomDelta);
187 
188  }
189 
190  SetActorRotation((InTargetLocation - GetActorLocation()).ToOrientationQuat());
191 
192  }
193 
194  void LookAt(const FVector& InTargetLocation, bool bMoveToNearTarget);
195 
196  template<typename T>
197 
198  void LookAt(const TArray<T*>& InTargetActors, bool bMoveToNearTarget)
199 
200  {
201 
202  LookAt(URRUObjectUtils::GetActorGroupCenter(InTargetActors), bMoveToNearTarget);
203 
204  }
205 
206  template<typename T>
207 
208  void LookAt(const TArray<TArray<T*>>& InTargetActorGroups, bool bMoveToNearTarget)
209 
210  {
211 
212  LookAt(URRUObjectUtils::GetActorGroupListCenter(InTargetActorGroups), bMoveToNearTarget);
213 
214  }
215 
216  void RandomizeFoV();
217 
218  void RandomizePose(const FVector& InBaseLocation, bool bIsRandomLocationOnly);
219 
220 
221 
222  float GetDistanceToFloor() const;
223 
224  template<typename T>
225 
226  float GetDistanceToActorsGroup(const TArray<T*>& InActors) const
227 
228  {
229 
230  return FVector::Dist(CameraComponent->GetComponentLocation(), URRUObjectUtils::GetActorGroupCenter(InActors));
231 
232  }
233 
234 
235 
236  template<typename T>
237 
238  float GetDistanceToActorGroupList(const TArray<TArray<T*>>& InActorGroups) const
239 
240  {
241 
242  return FVector::Dist(CameraComponent->GetComponentLocation(), URRUObjectUtils::GetActorGroupListCenter(InActorGroups));
243 
244  }
245 
246 
247 
248  float GetFocalLength() const
249 
250  {
251 
252  // HFOV = 2 * arctan( width / 2f )
253 
254  float halfFOV = FMath::DegreesToRadians(0.5f * CameraComponent->FieldOfView);
255 
256  return (0.5f * CameraComponent->OrthoWidth) / FMath::Tan(halfFOV);
257 
258  }
259 
260 
261 
262 protected:
263 
264  virtual void PrintSimConfig() const override;
265 
266 };
267 
ARRBaseActor::Initialize
virtual bool Initialize()
Set #GameMode #GameState #GameSingleton #PlayerController.
ARRCamera::LookAt
void LookAt(const FVector &InTargetLocation, const FVector &InTargetNormal, const FVector2f &InDistanceRange, const FVector2f &InHeightRange, const FVector2f &InAngleRange, bool bMoveToNearTarget)
Definition: RRCamera.h:150
URRMathUtils::GetRandomFloatInRange
static FORCEINLINE float GetRandomFloatInRange(float InValueA, float InValueB)
Return an almost uniformly distributed float random number between 2 float values [Min,...
Definition: RRMathUtils.h:406
ARRCamera::GetDistanceToActorGroupList
float GetDistanceToActorGroupList(const TArray< TArray< T * >> &InActorGroups) const
Definition: RRCamera.h:238
ARRCamera::LookAt
void LookAt(const TArray< T * > &InTargetActors, bool bMoveToNearTarget)
Definition: RRCamera.h:198
FRRCameraProperties
Camera user properties.
Definition: RRCamera.h:50
ARRBaseActor
Base actor class for all Rapyuta Sim actors:
Definition: RRBaseActor.h:70
ARRCamera::LookAt
void LookAt(const TArray< TArray< T * >> &InTargetActorGroups, bool bMoveToNearTarget)
Definition: RRCamera.h:208
RRUObjectUtils.h
UObject general utils.
URRUObjectUtils::GetActorGroupCenter
static FVector GetActorGroupCenter(const TArray< T * > &InActors)
Definition: RRUObjectUtils.h:1305
ARRCamera::GetDistanceToActorsGroup
float GetDistanceToActorsGroup(const TArray< T * > &InActors) const
Definition: RRCamera.h:226
RRMathUtils.h
Math utils.
ARRCamera::GetFocalLength
float GetFocalLength() const
Definition: RRCamera.h:248
FRRCameraProperties::PrintSelf
FORCEINLINE void PrintSelf() const
Definition: RRCamera.h:83
ARRBaseActor::PrintSimConfig
virtual void PrintSimConfig() const
Print class members' values configured in RapyutaSimSettings.ini.
Definition: RRBaseActor.h:411
URRUObjectUtils::GetActorGroupListCenter
static FVector GetActorGroupListCenter(const TArray< TArray< T * >> &InActorGroups)
Definition: RRUObjectUtils.h:1327
ARRCamera::CameraProperties
FRRCameraProperties CameraProperties
Definition: RRCamera.h:144
ARRCamera
Standalone camera actor which can be placed in the level with #UCameraComponent.
Definition: RRCamera.h:118
RRBaseActor.h
Base actor class for all Rapyuta Sim actors.