浏览代码

The way multiple quaternions being slerped was not good, changed approach to one that seems to work better.

Juan Linietsky 7 年之前
父节点
当前提交
9bab5134cf

+ 2 - 1
editor/plugins/root_motion_editor_plugin.cpp

@@ -124,9 +124,10 @@ void EditorPropertyRootMotion::_node_assign() {
 						ti = filters->create_item(ti);
 						parenthood[accum] = ti;
 						ti->set_text(0, F->get());
-						ti->set_selectable(0, false);
+						ti->set_selectable(0, true);
 						ti->set_editable(0, false);
 						ti->set_icon(0, get_icon("BoneAttachment", "EditorIcons"));
+						ti->set_metadata(0, accum);
 					} else {
 						ti = parenthood[accum];
 					}

+ 9 - 1
scene/animation/animation_tree.cpp

@@ -813,6 +813,7 @@ void AnimationTree::_process_graph(float p_delta) {
 							t->process_pass = process_pass;
 							t->loc = Vector3();
 							t->rot = Quat();
+							t->rot_blend_accum = 0;
 							t->scale = Vector3();
 						}
 
@@ -876,7 +877,14 @@ void AnimationTree::_process_graph(float p_delta) {
 								continue;
 
 							t->loc = t->loc.linear_interpolate(loc, blend);
-							t->rot = t->rot.slerp(rot, blend);
+							if (t->rot_blend_accum==0) {
+								t->rot = rot;
+								t->rot_blend_accum = blend;
+							} else {
+								float rot_total = t->rot_blend_accum + blend;
+								t->rot = rot.slerp(t->rot, t->rot_blend_accum / rot_total).normalized();
+								t->rot_blend_accum = rot_total;
+							}
 							t->scale = t->scale.linear_interpolate(scale, blend);
 						}
 

+ 1 - 0
scene/animation/animation_tree.h

@@ -161,6 +161,7 @@ private:
 		int bone_idx;
 		Vector3 loc;
 		Quat rot;
+		float rot_blend_accum;
 		Vector3 scale;
 
 		TrackCacheTransform() {