Apply a few recent chages in Quat and Basis to their respective Mono counterparts. (#11899)

This commit is contained in:
Ferenc Arn 2017-10-09 08:49:53 -04:00 committed by Rémi Verschelde
parent ea37f44ec8
commit 8ddbd19777
3 changed files with 70 additions and 19 deletions

View file

@ -160,26 +160,29 @@ namespace Godot
Basis m = this.orthonormalized(); Basis m = this.orthonormalized();
Vector3 euler; Vector3 euler;
euler.z = 0.0f;
euler.y = Mathf.asin(m.x[2]); float mxy = m.y[2];
if (euler.y < Mathf.PI * 0.5f)
if (mxy < 1.0f)
{ {
if (euler.y > -Mathf.PI * 0.5f) if (mxy > -1.0f)
{ {
euler.x = Mathf.atan2(-m.y[2], m.z[2]); euler.x = Mathf.asin(-mxy);
euler.z = Mathf.atan2(-m.x[1], m.x[0]); euler.y = Mathf.atan2(m.x[2], m.z[2]);
euler.z = Mathf.atan2(m.y[0], m.y[1]);
} }
else else
{ {
euler.z = 0.0f; euler.x = Mathf.PI * 0.5f;
euler.x = euler.z - Mathf.atan2(m.y[0], m.y[1]); euler.y = -Mathf.atan2(-m.x[1], m.x[0]);
} }
} }
else else
{ {
euler.z = 0f; euler.x = -Mathf.PI * 0.5f;
euler.x = Mathf.atan2(m.x[1], m.y[1]) - euler.z; euler.y = -Mathf.atan2(m.x[1], m.x[0]);
} }
return euler; return euler;
@ -273,7 +276,7 @@ namespace Godot
public Basis rotated(Vector3 axis, float phi) public Basis rotated(Vector3 axis, float phi)
{ {
return this * new Basis(axis, phi); return new Basis(axis, phi) * this;
} }
public Basis scaled(Vector3 scale) public Basis scaled(Vector3 scale)
@ -281,13 +284,13 @@ namespace Godot
Basis m = this; Basis m = this;
m[0, 0] *= scale.x; m[0, 0] *= scale.x;
m[1, 0] *= scale.x; m[0, 1] *= scale.x;
m[2, 0] *= scale.x; m[0, 2] *= scale.x;
m[0, 1] *= scale.y; m[1, 0] *= scale.y;
m[1, 1] *= scale.y; m[1, 1] *= scale.y;
m[2, 1] *= scale.y; m[1, 2] *= scale.y;
m[0, 2] *= scale.z; m[2, 0] *= scale.z;
m[1, 2] *= scale.z; m[2, 1] *= scale.z;
m[2, 2] *= scale.z; m[2, 2] *= scale.z;
return m; return m;
@ -347,6 +350,48 @@ namespace Godot
); );
} }
public Quat Quat() {
float trace = x[0] + y[1] + z[2];
if (trace > 0.0f) {
float s = Mathf.sqrt(trace + 1.0f) * 2f;
float inv_s = 1f / s;
return new Quat(
(z[1] - y[2]) * inv_s,
(x[2] - z[0]) * inv_s,
(y[0] - x[1]) * inv_s,
s * 0.25f
);
} else if (x[0] > y[1] && x[0] > z[2]) {
float s = Mathf.sqrt(x[0] - y[1] - z[2] + 1.0f) * 2f;
float inv_s = 1f / s;
return new Quat(
s * 0.25f,
(x[1] + y[0]) * inv_s,
(x[2] + z[0]) * inv_s,
(z[1] - y[2]) * inv_s
);
} else if (y[1] > z[2]) {
float s = Mathf.sqrt(-x[0] + y[1] - z[2] + 1.0f) * 2f;
float inv_s = 1f / s;
return new Quat(
(x[1] + y[0]) * inv_s,
s * 0.25f,
(y[2] + z[1]) * inv_s,
(x[2] - z[0]) * inv_s
);
} else {
float s = Mathf.sqrt(-x[0] - y[1] + z[2] + 1.0f) * 2f;
float inv_s = 1f / s;
return new Quat(
(x[2] + z[0]) * inv_s,
(y[2] + z[1]) * inv_s,
s * 0.25f,
(y[0] - x[1]) * inv_s
);
}
}
public Basis(Quat quat) public Basis(Quat quat)
{ {
float s = 2.0f / quat.length_squared(); float s = 2.0f / quat.length_squared();

View file

@ -201,12 +201,12 @@ namespace Godot
} }
else else
{ {
float s = Mathf.sin(-angle * 0.5f) / d; float s = Mathf.sin(angle * 0.5f) / d;
x = axis.x * s; x = axis.x * s;
y = axis.y * s; y = axis.y * s;
z = axis.z * s; z = axis.z * s;
w = Mathf.cos(-angle * 0.5f); w = Mathf.cos(angle * 0.5f);
} }
} }

View file

@ -35,7 +35,7 @@ namespace Godot
public Transform rotated(Vector3 axis, float phi) public Transform rotated(Vector3 axis, float phi)
{ {
return this * new Transform(new Basis(axis, phi), new Vector3()); return new Transform(new Basis(axis, phi), new Vector3()) * this;
} }
public Transform scaled(Vector3 scale) public Transform scaled(Vector3 scale)
@ -104,6 +104,12 @@ namespace Godot
this.origin = origin; this.origin = origin;
} }
public Transform(Quat quat, Vector3 origin)
{
this.basis = new Basis(quat);
this.origin = origin;
}
public Transform(Basis basis, Vector3 origin) public Transform(Basis basis, Vector3 origin)
{ {
this.basis = basis; this.basis = basis;