Ocean
TestJacobian.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) Meta Platforms, Inc. and affiliates.
3  *
4  * This source code is licensed under the MIT license found in the
5  * LICENSE file in the root directory of this source tree.
6  */
7 
8 #ifndef META_OCEAN_TEST_TESTGEOMETRY_TEST_JACOBIAN_H
9 #define META_OCEAN_TEST_TESTGEOMETRY_TEST_JACOBIAN_H
10 
12 
14 
17 
18 namespace Ocean
19 {
20 
21 namespace Test
22 {
23 
24 namespace TestGeometry
25 {
26 
27 /**
28  * This class implements Jacobian tests.
29  * @ingroup testgeometry
30  */
31 class OCEAN_TEST_GEOMETRY_EXPORT TestJacobian : protected Geometry::Jacobian
32 {
33  public:
34 
35  /**
36  * Tests the entire Jacobian functionality.
37  * @param testDuration Number of seconds for each test, with range (0, infinity)
38  * @return True, if succeeded
39  */
40  static bool test(const double testDuration);
41 
42  /**
43  * Tests the Jacobian for the rotational part of extrinsic camera parameters.
44  * @param testDuration Number of seconds for each test, with range (0, infinity)
45  * @return True, if succeeded
46  * @tparam T the data type of the scalar to be used, either 'float' or 'double'
47  */
48  template <typename T>
49  static bool testOrientationalJacobian2x3(const double testDuration);
50 
51  /**
52  * Tests the Jacobian for the orientation of a camera.
53  * @param testDuration Number of seconds for each test, with range (0, infinity)
54  * @return True, if succeeded
55  * @tparam T the data type of the scalar to be used, either 'float' or 'double'
56  */
57  template <typename T>
58  static bool testOrientationJacobian2nx3(const double testDuration);
59 
60  /**
61  * Deprecated.
62  *
63  * Tests the Jacobian for the extrinsic camera parameters and a pinhole camera.
64  * @param testDuration Number of seconds for each test, with range (0, infinity)
65  * @return True, if succeeded
66  */
67  static bool testPinholeCameraPoseJacobian2nx6(const double testDuration);
68 
69  /**
70  * Deprecated.
71  *
72  * Tests the Jacobian for the extrinsic camera parameters and fisheye camera.
73  * @param testDuration Number of seconds for each test, with range (0, infinity)
74  * @return True, if succeeded
75  */
76  static bool testFisheyeCameraPoseJacobian2x6(const double testDuration);
77 
78  /**
79  * Tests the Jacobian for the extrinsic camera parameters and any camera.
80  * @param testDuration Number of seconds for each test, with range (0, infinity)
81  * @return True, if succeeded
82  * @tparam T the data type of the scalar to be used, either 'float' or 'double'
83  */
84  template <typename T>
85  static bool testAnyCameraPoseJacobian2nx6(const double testDuration);
86 
87  /**
88  * Tests the Jacobian for the extrinsic camera parameters using a damped distortion.
89  * @param testDuration Number of seconds for each test, with range (0, infinity)
90  * @return True, if succeeded
91  */
92  static bool testPoseJacobianDampedDistortion2nx6(const double testDuration);
93 
94  /**
95  * Tests the Jacobian for the extrinsic camera parameters (including the zoom parameter).
96  * @param testDuration Number of seconds for each test, with range (0, infinity)
97  * @return True, if succeeded
98  */
99  static bool testPoseZoomJacobian2nx7(const double testDuration);
100 
101  /**
102  * Tests the 2x6 Jacobian for a 6-DOF transformation with fixed camera pose.
103  * @param testDuration Number of seconds for each test, with range (0, infinity)
104  * @return True, if succeeded
105  */
106  static bool testPinholeCameraObjectTransformation2nx6(const double testDuration);
107 
108  /**
109  * Tests the 2x6 Jacobian for a 6-DOF transformation with fixed camera pose.
110  * @param testDuration Number of seconds for each test, with range (0, infinity)
111  * @return True, if succeeded
112  */
113  static bool testFisheyeCameraObjectTransformation2nx6(const double testDuration);
114 
115  /**
116  * Tests the Jacobian for an 2D image point projection in relation to an object point using a pinhole camera.
117  * @param testDuration Number of seconds for each test, with range (0, infinity)
118  * @return True, if succeeded
119  */
120  static bool testPinholeCameraPointJacobian2nx3(const double testDuration);
121 
122  /**
123  * Tests the Jacobian for an 2D image point projection in relation to an object point using a fisheye camera.
124  * @param testDuration Number of seconds for each test, with range (0, infinity)
125  * @return True, if succeeded
126  */
127  static bool testFisheyeCameraPointJacobian2x3(const double testDuration);
128 
129  /**
130  * Tests the Jacobian for an 2D image point projection in relation to an object point using any camera.
131  * @param testDuration Number of seconds for each test, with range (0, infinity)
132  * @return True, if succeeded
133  */
134  static bool testAnyCameraPointJacobian2x3(const double testDuration);
135 
136  /**
137  * Tests the Jacobian for two 6DOF poses and a set of 3D object points.
138  * @param testDuration Number of seconds for each test, with range (0, infinity)
139  * @return True, if succeeded
140  */
141  static bool testPosesPointsJacobian2nx12(const double testDuration);
142 
143  /**
144  * Tests the Jacobian for an exponential map representing a 3D object point.
145  * @param testDuration Number of seconds for each test, with range (0, infinity)
146  * @return True, if succeeded
147  */
148  static bool testSphericalObjectPoint3x3(const double testDuration);
149 
150  /**
151  * Tests the Jacobian for an exponential map representing a 3D object point which is projected into the camera frame.
152  * @param testDuration Number of seconds for each test, with range (0, infinity)
153  * @return True, if succeeded
154  * @tparam T the data type of the scalar to be used, either 'float' or 'double'
155  */
156  template <typename T>
157  static bool testSphericalObjectPointOrientation2x3IF(const double testDuration);
158 
159  /**
160  * Tests the Jacobian for the radial and tangential distortion camera parameters.
161  * @param testDuration Number of seconds for each test, with range (0, infinity)
162  * @return True, if succeeded
163  */
164  static bool testCameraDistortionJacobian2x4(const double testDuration);
165 
166  /**
167  * Tests the Jacobian for the intrinsic and radial distortion camera parameters.
168  * @param testDuration Number of seconds for each test, with range (0, infinity)
169  * @return True, if succeeded
170  */
171  static bool testCameraJacobian2x6(const double testDuration);
172 
173  /**
174  * Tests the Jacobian for the intrinsic and radial and tangential distortion camera parameters.
175  * @param testDuration Number of seconds for each test, with range (0, infinity)
176  * @return True, if succeeded
177  */
178  static bool testCameraJacobian2x7(const double testDuration);
179 
180  /**
181  * Tests the Jacobian for the intrinsic and radial and tangential distortion camera parameters.
182  * @param testDuration Number of seconds for each test, with range (0, infinity)
183  * @return True, if succeeded
184  */
185  static bool testCameraJacobian2x8(const double testDuration);
186 
187  /**
188  * Tests the Jacobian for the rotational part of the extrinsic camera matrix, intrinsic and radial and tangential camera parameters.
189  * @param testDuration Number of seconds for each test, with range (0, infinity)
190  * @return True, if succeeded
191  */
192  static bool testOrientationCameraJacobian2x11(const double testDuration);
193 
194  /**
195  * Tests the Jacobian for the extrinsic, intrinsic and radial camera parameters.
196  * @param testDuration Number of seconds for each test, with range (0, infinity)
197  * @return True, if succeeded
198  */
199  static bool testPoseCameraJacobian2x12(const double testDuration);
200 
201  /**
202  * Tests the Jacobian for the extrinsic, intrinsic and radial and tangential distortion camera parameters.
203  * @param testDuration Number of seconds for each test, with range (0, infinity)
204  * @return True, if succeeded
205  */
206  static bool testPoseCameraJacobian2x14(const double testDuration);
207 
208  /**
209  * Tests the 2x8 Jacobian for the homography.
210  * @param testDuration Number of seconds for each test, with range (0, infinity)
211  * @return True, if succeeded
212  */
213  static bool testHomography2x8(const double testDuration);
214 
215  /**
216  * Tests the 2x9 Jacobian for the homography.
217  * @param testDuration Number of seconds for each test, with range (0, infinity)
218  * @return True, if succeeded
219  */
220  static bool testHomography2x9(const double testDuration);
221 
222  /**
223  * Tests the 2x8 Jacobian for the identity homography.
224  * @param testDuration Number of seconds for each test, with range (0, infinity)
225  * @return True, if succeeded
226  */
227  static bool testIdentityHomography2x8(const double testDuration);
228 
229  /**
230  * Tests the 2x9 Jacobian for the identity homography.
231  * @param testDuration Number of seconds for each test, with range (0, infinity)
232  * @return True, if succeeded
233  */
234  static bool testIdentityHomography2x9(const double testDuration);
235 
236  /**
237  * Tests the 2x4 Jacobian of a similarity transformation.
238  * @param testDuration Number of seconds for each test, with range (0, infinity)
239  * @return True, if succeeded
240  */
241  static bool testSimilarity2x4(const double testDuration);
242 
243  /**
244  * Tests the 2x2 Jacobian of the distortion of a normalized image point for a fisheye camera.
245  * @param testDuration Number of seconds for each test, with range (0, infinity)
246  * @return True, if succeeded
247  * @tparam T the data type of the scalar to be used, 'float', or 'double'
248  */
249  template <typename T>
250  static bool testCalculateFisheyeDistortNormalized2x2(const double testDuration);
251 
252  private:
253 
254  /**
255  * Determines the derivative for a given 2D position and compares the accuracy with the precise derivatives.
256  * @param original The original 2D position
257  * @param offset The offset position (result of the epsilon offset)
258  * @param eps The epsilon which was used to create the offset position, with range (0, infinity)
259  * @param derivativeX The precise derivative in x-direction to verify
260  * @param derivativeY The precise derivative in y-direction to verify
261  * @return True, if so
262  * @tparam T The data type of the scalar to be used, 'float' or 'double'
263  * @tparam TDerivative The data type of the derivative, `float` or `double`
264  */
265  template <typename T, typename TDerivative>
266  static inline bool checkAccuracy(const VectorT2<T>& original, const VectorT2<T>& offset, const T eps, const TDerivative derivativeX, const TDerivative derivativeY);
267 
268  /**
269  * Determines the derivative for a given 3D position and compares the accuracy with the precise derivatives.
270  * @param original The original 2D position
271  * @param offset The offset position (result of the epsilon offset)
272  * @param eps The epsilon which was used to create the offset position, with range (0, infinity)
273  * @param derivativeX The precise derivative in x-direction to verify
274  * @param derivativeY The precise derivative in y-direction to verify
275  * @param derivativeZ The precise derivative in z-direction to verify
276  * @return True, if so
277  * @tparam T The data type of the scalar to be used, 'float' or 'double'
278  */
279  template <typename T, typename TDerivative>
280  static inline bool checkAccuracy(const VectorT3<T>& original, const VectorT3<T>& offset, const T eps, const TDerivative derivativeX, const TDerivative derivativeY, const TDerivative derivativeZ);
281 
282  /**
283  * Calculates the two Jacobian rows for a given pose and dynamic object point.
284  * The derivatives are calculated for the 3D object point only.<br>
285  * The resulting Jacobian rows have the following form:<br>
286  * | dfx / dX, dfx / dY, dfx / dZ |<br>
287  * | dfy / dX, dfy / dY, dfy / dZ |<br>
288  * @param jx First row position of the jacobian, with 3 column entries receiving the point derivatives
289  * @param jy Second row position of the jacobian, with 3 column entries receiving the point derivatives
290  * @param pinholeCamera The pinhole camera to determine the Jacobian values for
291  * @param flippedCamera_T_world Pose to determine the Jacobian for (inverted and flipped)
292  * @param objectPoint 3D object point to determine the Jacobian for
293  * @param distortImagePoint True, to force the distortion of the image point using the distortion parameters of this camera object
294  * @tparam tUseBorderDistortionIfOutside True, to apply the distortion from the nearest point lying on the frame border if the point lies outside the visible camera area; False to apply the distortion from the given position
295  */
296  template <bool tUseBorderDistortionIfOutside>
297  static void calculatePointJacobian2x3(Scalar* jx, Scalar* jy, const PinholeCamera& pinholeCamera, const HomogenousMatrix4& flippedCamera_T_world, const Vector3& objectPoint, const bool distortImagePoint);
298 
299  /**
300  * Returns the minimal threshold necessary to succeed a verification.
301  * @return The necessary success rate, in percent, with range [0, 1]
302  */
303  static constexpr double successThreshold();
304 };
305 
306 template <typename T, typename TDerivative>
307 bool TestJacobian::checkAccuracy(const VectorT2<T>& original, const VectorT2<T>& offset, const T eps, const TDerivative derivativeX, const TDerivative derivativeY)
308 {
309  static_assert(sizeof(TDerivative) <= sizeof(T), "The derivative should not have more precision than epsilon");
310 
311  ocean_assert(eps > NumericT<T>::eps());
312 
313  // approximation of the derivative:
314  // f'(x) = [f(x + e) - f(x)] / e
315 
316  const T calculatedDerivativeX = (offset.x() - original.x()) / eps;
317  const T calculatedDerivativeY = (offset.y() - original.y()) / eps;
318 
319  const T maxX = max(NumericT<T>::abs(T(derivativeX)), NumericT<T>::abs(calculatedDerivativeX));
320  const T maxY = max(NumericT<T>::abs(T(derivativeY)), NumericT<T>::abs(calculatedDerivativeY));
321 
322  const T diffX = NumericT<T>::abs(T(derivativeX) - calculatedDerivativeX);
323  const T diffY = NumericT<T>::abs(T(derivativeY) - calculatedDerivativeY);
324 
325  if (NumericT<TDerivative>::isEqualEps(derivativeX) || NumericT<T>::isEqualEps(calculatedDerivativeX))
326  {
327  if (NumericT<T>::abs(diffX) > T(0.001))
328  {
329  return false;
330  }
331  }
332  else
333  {
334  if (NumericT<T>::isNotEqualEps(maxX) && diffX / maxX > T(0.05))
335  {
336  return false;
337  }
338  }
339 
340  if (NumericT<TDerivative>::isEqualEps(derivativeY) || NumericT<T>::isEqualEps(calculatedDerivativeY))
341  {
342  if (NumericT<T>::abs(diffY) > T(0.001))
343  {
344  return false;
345  }
346  }
347  else
348  {
349  if (NumericT<T>::isNotEqualEps(maxY) && diffY / maxY > T(0.05))
350  {
351  return false;
352  }
353  }
354 
355  return true;
356 }
357 
358 template <typename T, typename TDerivative>
359 inline bool TestJacobian::checkAccuracy(const VectorT3<T>& original, const VectorT3<T>& offset, const T eps, const TDerivative derivativeX, const TDerivative derivativeY, const TDerivative derivativeZ)
360 {
361  static_assert(sizeof(TDerivative) <= sizeof(T), "The derivative should not have more precision than epsilon");
362 
363  ocean_assert(eps > NumericT<T>::eps());
364 
365  // approximation of the derivative:
366  // f'(x) = [f(x + e) - f(x)] / e
367 
368  const T calculatedDerivativeX = (offset.x() - original.x()) / eps;
369  const T calculatedDerivativeY = (offset.y() - original.y()) / eps;
370  const T calculatedDerivativeZ = (offset.z() - original.z()) / eps;
371 
372  const T maxX = max(NumericT<T>::abs(T(derivativeX)), NumericT<T>::abs(calculatedDerivativeX));
373  const T maxY = max(NumericT<T>::abs(T(derivativeY)), NumericT<T>::abs(calculatedDerivativeY));
374  const T maxZ = max(NumericT<T>::abs(T(derivativeZ)), NumericT<T>::abs(calculatedDerivativeZ));
375 
376  const T diffX = NumericT<T>::abs(T(derivativeX) - calculatedDerivativeX);
377  const T diffY = NumericT<T>::abs(T(derivativeY) - calculatedDerivativeY);
378  const T diffZ = NumericT<T>::abs(T(derivativeZ) - calculatedDerivativeZ);
379 
380  if (NumericT<TDerivative>::isEqualEps(derivativeX) || NumericT<T>::isEqualEps(calculatedDerivativeX))
381  {
382  if (NumericT<T>::abs(diffX) > T(0.001))
383  {
384  return false;
385  }
386  }
387  else
388  {
389  if (NumericT<T>::isNotEqualEps(maxX) && diffX / maxX > T(0.05))
390  {
391  return false;
392  }
393  }
394 
395  if (NumericT<TDerivative>::isEqualEps(derivativeY) || NumericT<T>::isEqualEps(calculatedDerivativeY))
396  {
397  if (NumericT<T>::abs(diffY) > T(0.001))
398  {
399  return false;
400  }
401  }
402  else
403  {
404  if (NumericT<T>::isNotEqualEps(maxY) && diffY / maxY > T(0.05))
405  {
406  return false;
407  }
408  }
409 
410  if (NumericT<TDerivative>::isEqualEps(derivativeZ) || NumericT<T>::isEqualEps(calculatedDerivativeZ))
411  {
412  if (NumericT<T>::abs(diffZ) > T(0.001))
413  {
414  return false;
415  }
416  }
417  else
418  {
419  if (NumericT<T>::isNotEqualEps(maxZ) && diffZ / maxZ > T(0.05))
420  {
421  return false;
422  }
423  }
424 
425  return true;
426 }
427 
428 template <bool tUseBorderDistortionIfOutside>
429 void TestJacobian::calculatePointJacobian2x3(Scalar* jx, Scalar* jy, const PinholeCamera& pinholeCamera, const HomogenousMatrix4& flippedCamera_T_world, const Vector3& objectPoint, const bool distortImagePoint)
430 {
431  ocean_assert(jx != nullptr && jy != nullptr);
432  ocean_assert(flippedCamera_T_world.isValid());
433 
434  /**
435  * | dfx / dX, dfx / dY, dfx / dZ |<br>
436  * | dfy / dX, dfy / dY, dfy / dZ |<br>
437  */
438 
439  const Scalar eps = Numeric::weakEps();
440 
441  const Vector2 imagePoint(pinholeCamera.projectToImageIF<tUseBorderDistortionIfOutside>(flippedCamera_T_world, objectPoint, distortImagePoint));
442 
443  for (unsigned int n = 0u; n < 3u; ++n)
444  {
445  Vector3 dObjectPoint(objectPoint);
446 
447  dObjectPoint[n] += eps;
448 
449  const Vector2 dImagePoint(pinholeCamera.projectToImageIF<tUseBorderDistortionIfOutside>(flippedCamera_T_world, dObjectPoint, distortImagePoint));
450 
451  const Scalar dx = (dImagePoint.x() - imagePoint.x()) / eps;
452  const Scalar dy = (dImagePoint.y() - imagePoint.y()) / eps;
453 
454  jx[n] = dx;
455  jy[n] = dy;
456  }
457 }
458 
460 {
461  return 0.99;
462 }
463 
464 }
465 
466 }
467 
468 }
469 
470 #endif // META_OCEAN_TEST_TESTGEOMETRY_TEST_JACOBIAN_H
This class implements function to calculate the jacobian matrices for geometry functions.
Definition: Jacobian.h:37
bool isValid() const
Returns whether this matrix is a valid homogeneous transformation.
Definition: HomogenousMatrix4.h:1806
This class provides basic numeric functionalities.
Definition: Numeric.h:57
static constexpr T weakEps()
Returns a weak epsilon.
static T abs(const T value)
Returns the absolute value of a given value.
Definition: Numeric.h:1220
VectorT2< T > projectToImageIF(const HomogenousMatrixT4< T > &flippedCamera_T_world, const VectorT3< T > &objectPoint, const bool distortImagePoint, const T zoom=T(1)) const
Projects a 3D object point to the 2D image plane of the camera by a given inverse camera pose.
Definition: PinholeCamera.h:1816
This class implements Jacobian tests.
Definition: TestJacobian.h:32
static bool testOrientationCameraJacobian2x11(const double testDuration)
Tests the Jacobian for the rotational part of the extrinsic camera matrix, intrinsic and radial and t...
static bool testIdentityHomography2x8(const double testDuration)
Tests the 2x8 Jacobian for the identity homography.
static bool testSphericalObjectPointOrientation2x3IF(const double testDuration)
Tests the Jacobian for an exponential map representing a 3D object point which is projected into the ...
static bool checkAccuracy(const VectorT2< T > &original, const VectorT2< T > &offset, const T eps, const TDerivative derivativeX, const TDerivative derivativeY)
Determines the derivative for a given 2D position and compares the accuracy with the precise derivati...
Definition: TestJacobian.h:307
static bool testPinholeCameraObjectTransformation2nx6(const double testDuration)
Tests the 2x6 Jacobian for a 6-DOF transformation with fixed camera pose.
static void calculatePointJacobian2x3(Scalar *jx, Scalar *jy, const PinholeCamera &pinholeCamera, const HomogenousMatrix4 &flippedCamera_T_world, const Vector3 &objectPoint, const bool distortImagePoint)
Calculates the two Jacobian rows for a given pose and dynamic object point.
Definition: TestJacobian.h:429
static bool testPosesPointsJacobian2nx12(const double testDuration)
Tests the Jacobian for two 6DOF poses and a set of 3D object points.
static bool testAnyCameraPoseJacobian2nx6(const double testDuration)
Tests the Jacobian for the extrinsic camera parameters and any camera.
static bool testFisheyeCameraPointJacobian2x3(const double testDuration)
Tests the Jacobian for an 2D image point projection in relation to an object point using a fisheye ca...
static bool testCalculateFisheyeDistortNormalized2x2(const double testDuration)
Tests the 2x2 Jacobian of the distortion of a normalized image point for a fisheye camera.
static bool testHomography2x9(const double testDuration)
Tests the 2x9 Jacobian for the homography.
static bool testPoseZoomJacobian2nx7(const double testDuration)
Tests the Jacobian for the extrinsic camera parameters (including the zoom parameter).
static bool testSphericalObjectPoint3x3(const double testDuration)
Tests the Jacobian for an exponential map representing a 3D object point.
static bool testHomography2x8(const double testDuration)
Tests the 2x8 Jacobian for the homography.
static bool testAnyCameraPointJacobian2x3(const double testDuration)
Tests the Jacobian for an 2D image point projection in relation to an object point using any camera.
static bool testSimilarity2x4(const double testDuration)
Tests the 2x4 Jacobian of a similarity transformation.
static bool test(const double testDuration)
Tests the entire Jacobian functionality.
static bool testCameraJacobian2x8(const double testDuration)
Tests the Jacobian for the intrinsic and radial and tangential distortion camera parameters.
static bool testFisheyeCameraObjectTransformation2nx6(const double testDuration)
Tests the 2x6 Jacobian for a 6-DOF transformation with fixed camera pose.
static bool testCameraJacobian2x6(const double testDuration)
Tests the Jacobian for the intrinsic and radial distortion camera parameters.
static bool testOrientationJacobian2nx3(const double testDuration)
Tests the Jacobian for the orientation of a camera.
static bool testPoseCameraJacobian2x12(const double testDuration)
Tests the Jacobian for the extrinsic, intrinsic and radial camera parameters.
static bool testPinholeCameraPointJacobian2nx3(const double testDuration)
Tests the Jacobian for an 2D image point projection in relation to an object point using a pinhole ca...
static bool testPoseCameraJacobian2x14(const double testDuration)
Tests the Jacobian for the extrinsic, intrinsic and radial and tangential distortion camera parameter...
static bool testIdentityHomography2x9(const double testDuration)
Tests the 2x9 Jacobian for the identity homography.
static bool testCameraJacobian2x7(const double testDuration)
Tests the Jacobian for the intrinsic and radial and tangential distortion camera parameters.
static bool testFisheyeCameraPoseJacobian2x6(const double testDuration)
Deprecated.
static bool testOrientationalJacobian2x3(const double testDuration)
Tests the Jacobian for the rotational part of extrinsic camera parameters.
static bool testPinholeCameraPoseJacobian2nx6(const double testDuration)
Deprecated.
static constexpr double successThreshold()
Returns the minimal threshold necessary to succeed a verification.
Definition: TestJacobian.h:459
static bool testPoseJacobianDampedDistortion2nx6(const double testDuration)
Tests the Jacobian for the extrinsic camera parameters using a damped distortion.
static bool testCameraDistortionJacobian2x4(const double testDuration)
Tests the Jacobian for the radial and tangential distortion camera parameters.
This class implements a vector with two elements.
Definition: Vector2.h:96
const T & x() const noexcept
Returns the x value.
Definition: Vector2.h:698
const T & y() const noexcept
Returns the y value.
Definition: Vector2.h:710
This class implements a vector with three elements.
Definition: Vector3.h:97
const T & y() const noexcept
Returns the y value.
Definition: Vector3.h:812
const T & x() const noexcept
Returns the x value.
Definition: Vector3.h:800
const T & z() const noexcept
Returns the z value.
Definition: Vector3.h:824
float Scalar
Definition of a scalar type.
Definition: Math.h:128
The namespace covering the entire Ocean framework.
Definition: Accessor.h:15