[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26880] trunk/blender/release/scripts: Added a euler filter script, to filter out discontineouities in euler curves (e.g.
Joseph Eagar
joeedh at gmail.com
Sun Feb 14 04:18:44 CET 2010
Revision: 26880
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26880
Author: joeedh
Date: 2010-02-14 04:18:43 +0100 (Sun, 14 Feb 2010)
Log Message:
-----------
Added a euler filter script, to filter out discontineouities in euler curves (e.g. where curves randomly have -/+ multiples of 360 offsets in sections). To use, select a curve in the fcurve editor and do Channel->Discontinuity (Euler) Filter. Note, will only work on euler rotation curves, won't do anything on anything else.
Modified Paths:
--------------
trunk/blender/release/scripts/ui/space_graph.py
Added Paths:
-----------
trunk/blender/release/scripts/op/euler_filter.py
Added: trunk/blender/release/scripts/op/euler_filter.py
===================================================================
--- trunk/blender/release/scripts/op/euler_filter.py (rev 0)
+++ trunk/blender/release/scripts/op/euler_filter.py 2010-02-14 03:18:43 UTC (rev 26880)
@@ -0,0 +1,64 @@
+from math import *
+import bpy
+from Mathutils import *
+
+def main(context):
+ def cleanupEulCurve(fcv):
+ keys = []
+
+ for k in fcv.keyframe_points:
+ keys.append([k.handle1.copy(), k.co.copy(), k.handle2.copy()])
+ print(keys)
+
+ for i in range(len(keys)):
+ cur = keys[i]
+ prev = keys[i-1] if i > 0 else None
+ next = keys[i+1] if i < len(keys)-1 else None
+
+ if prev == None:
+ continue
+
+ th = pi
+ if abs(prev[1][1] - cur[1][1]) >= th: # more than 180 degree jump
+ fac = pi*2
+ if prev[1][1] > cur[1][1]:
+ while abs(cur[1][1]-prev[1][1]) >= th: # < prev[1][1]:
+ cur[0][1] += fac
+ cur[1][1] += fac
+ cur[2][1] += fac
+ elif prev[1][1] < cur[1][1]:
+ while abs(cur[1][1]-prev[1][1]) >= th:
+ cur[0][1] -= fac
+ cur[1][1] -= fac
+ cur[2][1] -= fac
+
+ for i in range(len(keys)):
+ for x in range(2):
+ fcv.keyframe_points[i].handle1[x] = keys[i][0][x]
+ fcv.keyframe_points[i].co[x] = keys[i][1][x]
+ fcv.keyframe_points[i].handle2[x] = keys[i][2][x]
+
+ flist = bpy.context.active_object.animation_data.action.fcurves
+ for f in flist:
+ if f.selected and f.data_path.endswith("rotation_euler"):
+ cleanupEulCurve(f)
+
+class DiscontFilterOp(bpy.types.Operator):
+ """
+ Fixes the most common causes of gimbal lock in the fcurves of
+ the active bone.
+ """
+ bl_idname = "graph.discont_filter"
+ bl_label = "Filter out discontinuities in the active fcurves"
+
+ def poll(self, context):
+ return context.active_object != None
+
+ def execute(self, context):
+ main(context)
+ return {'FINISHED'}
+
+bpy.types.register(DiscontFilterOp)
+
+if __name__ == "__main__":
+ bpy.ops.graph.discont_filter()
\ No newline at end of file
Property changes on: trunk/blender/release/scripts/op/euler_filter.py
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: trunk/blender/release/scripts/ui/space_graph.py
===================================================================
--- trunk/blender/release/scripts/ui/space_graph.py 2010-02-14 03:17:52 UTC (rev 26879)
+++ trunk/blender/release/scripts/ui/space_graph.py 2010-02-14 03:18:43 UTC (rev 26880)
@@ -147,7 +147,10 @@
layout.operator("anim.channels_expand")
layout.operator("anim.channels_collapse")
+ layout.separator()
+ layout.operator("graph.discont_filter", text="Discontinuity (Euler) Filter")
+
class GRAPH_MT_key(bpy.types.Menu):
bl_label = "Key"
@@ -182,7 +185,6 @@
layout.operator("graph.copy")
layout.operator("graph.paste")
-
class GRAPH_MT_key_transform(bpy.types.Menu):
bl_label = "Transform"
More information about the Bf-blender-cvs
mailing list