diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs
index 36f5d8e2abf..74425c98355 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs
@@ -1,5 +1,6 @@
using System;
using System.Runtime.InteropServices;
+using System.ComponentModel;
namespace Godot
{
@@ -623,21 +624,31 @@ namespace Godot
///
/// The position to look at.
/// The relative up direction.
+ ///
+ /// If true, then the model is oriented in reverse,
+ /// towards the model front axis (+Z, Vector3.ModelFront),
+ /// which is more useful for orienting 3D models.
+ ///
/// The resulting basis matrix.
- public static Basis LookingAt(Vector3 target, Vector3 up)
+ public static Basis LookingAt(Vector3 target, Vector3? up = null, bool useModelFront = false)
{
+ up ??= Vector3.Up;
#if DEBUG
if (target.IsZeroApprox())
{
throw new ArgumentException("The vector can't be zero.", nameof(target));
}
- if (up.IsZeroApprox())
+ if (up.Value.IsZeroApprox())
{
throw new ArgumentException("The vector can't be zero.", nameof(up));
}
#endif
- Vector3 column2 = -target.Normalized();
- Vector3 column0 = up.Cross(column2);
+ Vector3 column2 = target.Normalized();
+ if (!useModelFront)
+ {
+ column2 = -column2;
+ }
+ Vector3 column0 = up.Value.Cross(column2);
#if DEBUG
if (column0.IsZeroApprox())
{
@@ -649,6 +660,13 @@ namespace Godot
return new Basis(column0, column1, column2);
}
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public static Basis LookingAt(Vector3 target, Vector3 up)
+ {
+ return LookingAt(target, up, false);
+ }
+
///
/// Returns the orthonormalized version of the basis matrix (useful to
/// call occasionally to avoid rounding errors for orthogonal matrices).
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs
index 1e2aaa299f0..ae2c025137a 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs
@@ -1,5 +1,6 @@
using System;
using System.Runtime.InteropServices;
+using System.ComponentModel;
namespace Godot
{
@@ -175,14 +176,26 @@ namespace Godot
///
/// The object to look at.
/// The relative up direction.
+ ///
+ /// If true, then the model is oriented in reverse,
+ /// towards the model front axis (+Z, Vector3.ModelFront),
+ /// which is more useful for orienting 3D models.
+ ///
/// The resulting transform.
- public readonly Transform3D LookingAt(Vector3 target, Vector3 up)
+ public readonly Transform3D LookingAt(Vector3 target, Vector3? up = null, bool useModelFront = false)
{
Transform3D t = this;
- t.SetLookAt(Origin, target, up);
+ t.SetLookAt(Origin, target, up ?? Vector3.Up, useModelFront);
return t;
}
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public readonly Transform3D LookingAt(Vector3 target, Vector3 up)
+ {
+ return LookingAt(target, up, false);
+ }
+
///
/// Returns the transform with the basis orthogonal (90 degrees),
/// and normalized axis vectors (scale of 1 or -1).
@@ -247,9 +260,9 @@ namespace Godot
return new Transform3D(Basis * tmpBasis, Origin);
}
- private void SetLookAt(Vector3 eye, Vector3 target, Vector3 up)
+ private void SetLookAt(Vector3 eye, Vector3 target, Vector3 up, bool useModelFront = false)
{
- Basis = Basis.LookingAt(target - eye, up);
+ Basis = Basis.LookingAt(target - eye, up, useModelFront);
Origin = eye;
}
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs
index c773c0fda6b..d929b5c6abd 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs
@@ -660,6 +660,13 @@ namespace Godot
private static readonly Vector3 _forward = new Vector3(0, 0, -1);
private static readonly Vector3 _back = new Vector3(0, 0, 1);
+ private static readonly Vector3 _modelLeft = new Vector3(1, 0, 0);
+ private static readonly Vector3 _modelRight = new Vector3(-1, 0, 0);
+ private static readonly Vector3 _modelTop = new Vector3(0, 1, 0);
+ private static readonly Vector3 _modelBottom = new Vector3(0, -1, 0);
+ private static readonly Vector3 _modelFront = new Vector3(0, 0, 1);
+ private static readonly Vector3 _modelRear = new Vector3(0, 0, -1);
+
///
/// Zero vector, a vector with all components set to 0.
///
@@ -711,6 +718,31 @@ namespace Godot
/// Equivalent to new Vector3(0, 0, 1).
public static Vector3 Back { get { return _back; } }
+ ///
+ /// Unit vector pointing towards the left side of imported 3D assets.
+ ///
+ public static Vector3 ModelLeft { get { return _modelLeft; } }
+ ///
+ /// Unit vector pointing towards the right side of imported 3D assets.
+ ///
+ public static Vector3 ModelRight { get { return _modelRight; } }
+ ///
+ /// Unit vector pointing towards the top side (up) of imported 3D assets.
+ ///
+ public static Vector3 ModelTop { get { return _modelTop; } }
+ ///
+ /// Unit vector pointing towards the bottom side (down) of imported 3D assets.
+ ///
+ public static Vector3 ModelBottom { get { return _modelBottom; } }
+ ///
+ /// Unit vector pointing towards the front side (facing forward) of imported 3D assets.
+ ///
+ public static Vector3 ModelFront { get { return _modelFront; } }
+ ///
+ /// Unit vector pointing towards the rear side (back) of imported 3D assets.
+ ///
+ public static Vector3 ModelRear { get { return _modelRear; } }
+
///
/// Constructs a new with the given components.
///