2
0
Эх сурвалжийг харах

added lerp to nearest, slerp to nearest by default

ncannasse 12 жил өмнө
parent
commit
2ab7cf1709
1 өөрчлөгдсөн 12 нэмэгдсэн , 7 устгасан
  1. 12 7
      h3d/Quat.hx

+ 12 - 7
h3d/Quat.hx

@@ -131,11 +131,16 @@ class Quat {
 		);
 	}
 	
-	public inline function lerp( q1 : Quat, q2 : Quat, v : Float ) {
-		var x = q1.x * v + q2.x * (1 - v);
-		var y = q1.y * v + q2.y * (1 - v);
-		var z = q1.z * v + q2.z * (1 - v);
-		var w = q1.w * v + q2.w * (1 - v);
+	public inline function lerp( q1 : Quat, q2 : Quat, v : Float, nearest = false ) {
+		var v2;
+		if( nearest && q1.dot(q2) < 0 )
+			v2 = v - 1;
+		else
+			v2 = 1 - v;
+		var x = q1.x * v + q2.x * v2;
+		var y = q1.y * v + q2.y * v2;
+		var z = q1.z * v + q2.z * v2;
+		var w = q1.w * v + q2.w * v2;
 		this.x = x;
 		this.y = y;
 		this.z = z;
@@ -154,11 +159,11 @@ class Quat {
 		var halfTheta = Math.acos(cosHalfTheta);
 		var invSinHalfTheta = FMath.isqrt(1 - cosHalfTheta * cosHalfTheta);
 		if( FMath.abs(invSinHalfTheta) > 1e3 ) {
-			this.lerp(q1, q2, 0.5);
+			this.lerp(q1, q2, 0.5, true);
 			return;
 		}
 		var a = Math.sin((1 - v) * halfTheta) * invSinHalfTheta;
-		var b = Math.sin(v * halfTheta) * invSinHalfTheta;
+		var b = Math.sin(v * halfTheta) * invSinHalfTheta * (cosHalfTheta < 0 ? -1 : 1);
 		this.x = q1.x * a + q2.x * b;
 		this.y = q1.y * a + q2.y * b;
 		this.z = q1.z * a + q2.z * b;