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)