Add Quaternion::FromDirection to C++

This commit is contained in:
Wojtek Figat
2021-11-03 10:44:12 +01:00
parent f8e63f2994
commit 5f7112a404
2 changed files with 24 additions and 0 deletions

View File

@@ -227,6 +227,23 @@ void Quaternion::Billboard(const Vector3& objectPosition, const Vector3& cameraP
RotationMatrix(matrix, result);
}
Quaternion Quaternion::FromDirection(const Vector3& direction)
{
Quaternion orientation;
if (Vector3::Dot(direction, Vector3::Up) >= 0.999f)
{
RotationAxis(Vector3::Left, PI_OVER_2, orientation);
}
else
{
Vector3 right, up;
Vector3::Cross(direction, Vector3::Up, right);
Vector3::Cross(right, direction, up);
LookRotation(direction, up, orientation);
}
return orientation;
}
void Quaternion::LookRotation(const Vector3& forward, const Vector3& up, Quaternion& result)
{
Vector3 forwardNorm = forward;

View File

@@ -587,6 +587,13 @@ public:
// @param result When the method completes, contains the created billboard quaternion
static void Billboard(const Vector3& objectPosition, const Vector3& cameraPosition, const Vector3& cameraUpVector, const Vector3& cameraForwardVector, Quaternion& result);
/// <summary>
/// Calculates the orientation from the direction vector.
/// </summary>
/// <param name="direction">The direction vector (normalized).</param>
/// <returns>The orientation.</returns>
static Quaternion FromDirection(const Vector3& direction);
/// <summary>
/// Creates a rotation with the specified forward and upwards directions.
/// </summary>