diff --git a/Source/Engine/Core/Math/Quaternion.cs b/Source/Engine/Core/Math/Quaternion.cs
index 125b5b36c..684fb26b4 100644
--- a/Source/Engine/Core/Math/Quaternion.cs
+++ b/Source/Engine/Core/Math/Quaternion.cs
@@ -697,6 +697,27 @@ namespace FlaxEngine
return result;
}
+ ///
+ /// Calculates the orientation from the direction vector.
+ ///
+ /// The direction vector (normalized).
+ /// The orientation.
+ public static Quaternion FromDirection(Vector3 direction)
+ {
+ Quaternion orientation;
+ if (Vector3.Dot(direction, Vector3.Up) >= 0.999f)
+ {
+ orientation = RotationAxis(Vector3.Left, Mathf.PiOverTwo);
+ }
+ else
+ {
+ Vector3 right = Vector3.Cross(direction, Vector3.Up);
+ Vector3 up = Vector3.Cross(right, direction);
+ orientation = LookRotation(direction, up);
+ }
+ return orientation;
+ }
+
///
/// Performs a linear interpolation between two quaternions.
///
diff --git a/Source/Engine/UI/UICanvas.cs b/Source/Engine/UI/UICanvas.cs
index cbd554775..4030b66b9 100644
--- a/Source/Engine/UI/UICanvas.cs
+++ b/Source/Engine/UI/UICanvas.cs
@@ -306,16 +306,13 @@ namespace FlaxEngine
{
var view = _editorTask.View;
var transform = Transform;
- var cameraPosition = view.Position;
- var cameraDirection = view.Direction;
- var up = Vector3.Up;
Matrix.Translation(_guiRoot.Width * -0.5f, _guiRoot.Height * -0.5f, 0, out var m1);
Matrix.Scaling(ref transform.Scale, out var m2);
Matrix.Multiply(ref m1, ref m2, out var m3);
Quaternion.Euler(180, 180, 0, out var quat);
Matrix.RotationQuaternion(ref quat, out m2);
Matrix.Multiply(ref m3, ref m2, out m1);
- Matrix.Billboard(ref transform.Translation, ref cameraPosition, ref up, ref cameraDirection, out m2);
+ m2 = Matrix.Transformation(Vector3.One, Quaternion.FromDirection(-view.Direction), transform.Translation);
Matrix.Multiply(ref m1, ref m2, out world);
}
else if (_renderMode == CanvasRenderMode.CameraSpace)
@@ -358,16 +355,13 @@ namespace FlaxEngine
{
// In 3D world face camera
var transform = Transform;
- var cameraPosition = camera.Position;
- var cameraDirection = camera.Direction;
- var up = Vector3.Up;
Matrix.Translation(_guiRoot.Width * -0.5f, _guiRoot.Height * -0.5f, 0, out var m1);
Matrix.Scaling(ref transform.Scale, out var m2);
Matrix.Multiply(ref m1, ref m2, out var m3);
Quaternion.Euler(180, 180, 0, out var quat);
Matrix.RotationQuaternion(ref quat, out m2);
Matrix.Multiply(ref m3, ref m2, out m1);
- Matrix.Billboard(ref transform.Translation, ref cameraPosition, ref up, ref cameraDirection, out m2);
+ m2 = Matrix.Transformation(Vector3.One, Quaternion.FromDirection(-camera.Direction), transform.Translation);
Matrix.Multiply(ref m1, ref m2, out world);
}
else if (_renderMode == CanvasRenderMode.CameraSpace && camera)