@@ -697,6 +697,27 @@ namespace FlaxEngine
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculates the orientation from the direction vector.
|
||||
/// </summary>
|
||||
/// <param name="direction">The direction vector (normalized).</param>
|
||||
/// <returns>The orientation.</returns>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs a linear interpolation between two quaternions.
|
||||
/// </summary>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user