diff --git a/Source/Engine/Core/Math/Transform.cpp b/Source/Engine/Core/Math/Transform.cpp
index 5ac71779b..728fc6a90 100644
--- a/Source/Engine/Core/Math/Transform.cpp
+++ b/Source/Engine/Core/Math/Transform.cpp
@@ -94,6 +94,13 @@ Vector3 Transform::LocalToWorld(const Vector3& point) const
return result + Translation;
}
+Vector3 Transform::LocalToWorldVector(const Vector3& vector) const
+{
+ Vector3 result = vector * Scale;
+ Vector3::Transform(result, Orientation, result);
+ return result;
+}
+
void Transform::LocalToWorld(const Vector3& point, Vector3& result) const
{
Vector3 tmp = point * Scale;
@@ -171,6 +178,24 @@ Vector3 Transform::WorldToLocal(const Vector3& point) const
return result * invScale;
}
+Vector3 Transform::WorldToLocalVector(const Vector3& vector) const
+{
+ Vector3 invScale = Scale;
+ if (invScale.X != 0.0f)
+ invScale.X = 1.0f / invScale.X;
+ if (invScale.Y != 0.0f)
+ invScale.Y = 1.0f / invScale.Y;
+ if (invScale.Z != 0.0f)
+ invScale.Z = 1.0f / invScale.Z;
+
+ const Quaternion invRotation = Orientation.Conjugated();
+
+ Vector3 result;
+ Vector3::Transform(vector, invRotation, result);
+
+ return result * invScale;
+}
+
void Transform::WorldToLocal(const Vector3* points, int32 pointsCount, Vector3* result) const
{
Vector3 invScale = Scale;
diff --git a/Source/Engine/Core/Math/Transform.cs b/Source/Engine/Core/Math/Transform.cs
index 21ed705ff..7065309e3 100644
--- a/Source/Engine/Core/Math/Transform.cs
+++ b/Source/Engine/Core/Math/Transform.cs
@@ -197,6 +197,18 @@ namespace FlaxEngine
return point + Translation;
}
+ ///
+ /// Performs transformation of the given vector in local space to the world space of this transform.
+ ///
+ /// The local space vector.
+ /// The world space vector.
+ public Vector3 LocalToWorldVector(Vector3 vector)
+ {
+ vector *= Scale;
+ Vector3.Transform(ref vector, ref Orientation, out vector);
+ return vector;
+ }
+
///
/// Perform transformation of the given points in local space
///
@@ -259,6 +271,29 @@ namespace FlaxEngine
return result * invScale;
}
+ ///
+ /// Perform transformation of the given vector in world space
+ ///
+ /// World space vector
+ /// Local space vector
+ public Vector3 WorldToLocalVector(Vector3 vector)
+ {
+ Vector3 invScale = Scale;
+ if (invScale.X != 0.0f)
+ invScale.X = 1.0f / invScale.X;
+ if (invScale.Y != 0.0f)
+ invScale.Y = 1.0f / invScale.Y;
+ if (invScale.Z != 0.0f)
+ invScale.Z = 1.0f / invScale.Z;
+
+ Quaternion invRotation = Orientation;
+ invRotation.Invert();
+
+ Vector3.Transform(ref vector, ref invRotation, out var result);
+
+ return result * invScale;
+ }
+
///
/// Perform transformation of the given points in world space
///
diff --git a/Source/Engine/Core/Math/Transform.h b/Source/Engine/Core/Math/Transform.h
index c5e67c986..5a39c2d86 100644
--- a/Source/Engine/Core/Math/Transform.h
+++ b/Source/Engine/Core/Math/Transform.h
@@ -184,6 +184,13 @@ public:
/// The world space point.
Vector3 LocalToWorld(const Vector3& point) const;
+ ///
+ /// Performs transformation of the given vector in local space to the world space of this transform.
+ ///
+ /// The local space vector.
+ /// The world space vector.
+ Vector3 LocalToWorldVector(const Vector3& vector) const;
+
///
/// Performs transformation of the given point in local space to the world space of this transform.
///
@@ -220,6 +227,13 @@ public:
/// The local space point.
Vector3 WorldToLocal(const Vector3& point) const;
+ ///
+ /// Performs transformation of the given vector in world space to the local space of this transform.
+ ///
+ /// The world space vector.
+ /// The local space vector.
+ Vector3 WorldToLocalVector(const Vector3& vector) const;
+
///
/// Performs transformation of the given points in world space to the local space of this transform.
///