浏览代码

Add Quaternion.lerp()

Daniele Bartolini 10 年之前
父节点
当前提交
5e81830f7d
共有 2 个文件被更改,包括 43 次插入10 次删除
  1. 25 0
      src/core/math/quaternion.h
  2. 18 10
      src/lua/lua_math.cpp

+ 25 - 0
src/core/math/quaternion.h

@@ -180,5 +180,30 @@ inline Vector3 forward(const Quaternion& q)
 	return m.z;
 }
 
+/// Returns the linearly interpolated quaternion between *a* and *b* at time *t* in [0, 1]. It uses NLerp.
+inline Quaternion lerp(const Quaternion& a, const Quaternion& b, float t)
+{
+	const float t1 = 1.0f - t;
+
+	Quaternion r;
+
+	if (dot(a, b) < 0.0f)
+	{
+		r.x = t1*a.x + t*-b.x;
+		r.y = t1*a.y + t*-b.y;
+		r.z = t1*a.z + t*-b.z;
+		r.w = t1*a.w + t*-b.w;
+	}
+	else
+	{
+		r.x = t1*a.x + t*b.x;
+		r.y = t1*a.y + t*b.y;
+		r.z = t1*a.z + t*b.z;
+		r.w = t1*a.w + t*b.w;
+	}
+
+	return normalize(r);
+}
+
 // @}
 } // namespace crown

+ 18 - 10
src/lua/lua_math.cpp

@@ -744,18 +744,10 @@ static int quaternion_forward(lua_State* L)
 	return 1;
 }
 
-static int quaternionbox_new(lua_State* L)
+static int quaternion_lerp(lua_State* L)
 {
 	LuaStack stack(L);
-
-	if (stack.num_args() == 1)
-		stack.push_quaternionbox(stack.get_quaternion(1));
-	else
-		stack.push_quaternionbox(quaternion(stack.get_float(1)
-			, stack.get_float(2)
-			, stack.get_float(3)
-			, stack.get_float(4)));
-
+	stack.push_quaternion(lerp(stack.get_quaternion(1), stack.get_quaternion(2), stack.get_float(3)));
 	return 1;
 }
 
@@ -769,6 +761,21 @@ static int quaternion_to_string(lua_State* L)
 	return 1;
 }
 
+static int quaternionbox_new(lua_State* L)
+{
+	LuaStack stack(L);
+
+	if (stack.num_args() == 1)
+		stack.push_quaternionbox(stack.get_quaternion(1));
+	else
+		stack.push_quaternionbox(quaternion(stack.get_float(1)
+			, stack.get_float(2)
+			, stack.get_float(3)
+			, stack.get_float(4)));
+
+	return 1;
+}
+
 static int quaternionbox_ctor(lua_State* L)
 {
 	LuaStack stack(L);
@@ -1001,6 +1008,7 @@ void load_math(LuaEnvironment& env)
 	env.load_module_function("Quaternion", "right",              quaternion_right);
 	env.load_module_function("Quaternion", "up",                 quaternion_up);
 	env.load_module_function("Quaternion", "forward",            quaternion_forward);
+	env.load_module_function("Quaternion", "lerp",               quaternion_lerp);
 	env.load_module_function("Quaternion", "to_string",          quaternion_to_string);
 
 	env.load_module_constructor("Quaternion", quaternion_ctor);