[Bf-extensions-cvs] [3b1a9ce7] master: io_anim_c3d: move to contrib: T63750
meta-androcto
noreply at git.blender.org
Fri May 24 03:11:54 CEST 2019
Commit: 3b1a9ce7aa8704de3af4b73af4776fd5bca4ae13
Author: meta-androcto
Date: Fri May 24 11:11:31 2019 +1000
Branches: master
https://developer.blender.org/rBA3b1a9ce7aa8704de3af4b73af4776fd5bca4ae13
io_anim_c3d: move to contrib: T63750
===================================================================
D io_anim_c3d/__init__.py
D io_anim_c3d/import_c3d.py
===================================================================
diff --git a/io_anim_c3d/__init__.py b/io_anim_c3d/__init__.py
deleted file mode 100644
index 88ff974b..00000000
--- a/io_anim_c3d/__init__.py
+++ /dev/null
@@ -1,366 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 3
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# <pep8-80 compliant>
-
-# This script was developed with financial support from the Foundation for
-# Science and Technology of Portugal, under the grant SFRH/BD/66452/2009.
-
-
-bl_info = {
- "name": "C3D Graphics Lab Motion Capture file (.c3d)",
- "author": "Daniel Monteiro Basso <daniel at basso.inf.br>",
- "version": (2015, 5, 5, 1),
- "blender": (2, 74, 1),
- "location": "File > Import",
- "description": "Imports C3D Graphics Lab Motion Capture files",
- "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
- "Scripts/Import-Export/C3D_Importer",
- "category": 'Import-Export',
-}
-
-
-import bpy
-from bpy.props import (
- StringProperty,
- BoolProperty,
- FloatProperty,
- IntProperty,
-)
-
-import os
-import math
-from mathutils import Vector
-from . import import_c3d
-
-
-class C3DAnimateCloud(bpy.types.Operator):
- """
- Animate the Marker Cloud
- """
- bl_idname = "import_anim.c3danim"
- bl_label = "Animate C3D"
-
- is_armature = False
- markerset = None
- uname = None
- curframe = 0
- fskip = 0
- scale = 0
- timer = None
- Y_up = False
-
- def update_empty(self, fno, ml, m):
- name = self.unames[self.prefix + ml]
- o = bpy.context.scene.objects[name]
- p = Vector(m.position) * self.scale
- o.location = Vector((p[0], -p[2], p[1])) if self.Y_up else p
- o.keyframe_insert('location', frame=fno)
-
- def update_bone(self, fno, ml, m, bones):
- name = self.prefix + ml
- if name not in bones:
- return
- b = bones[name]
- p = Vector(m.position) * self.scale
- b.matrix.translation = Vector((p[0], -p[2], p[1])) if self.Y_up else p
- b.keyframe_insert('location', -1, fno, name)
-
- def update_frame(self):
- fno = self.curframe
- if not self.use_frame_no:
- fno = (self.curframe - self.markerset.startFrame) / self.fskip
- for i in range(self.fskip):
- self.markerset.readNextFrameData()
- if self.is_armature:
- bones = bpy.context.active_object.pose.bones
- for ml in self.markerset.markerLabels:
- m = self.markerset.getMarker(ml, self.curframe)
- if m.confidence < self.confidence:
- continue
- if self.is_armature:
- self.update_bone(fno, ml, m, bones)
- else:
- self.update_empty(fno, ml, m)
-
- def modal(self, context, event):
- if event.type == 'ESC':
- return self.cancel(context)
- if event.type == 'TIMER':
- if self.curframe > self.markerset.endFrame:
- return self.cancel(context)
- self.update_frame()
- self.curframe += self.fskip
- return {'PASS_THROUGH'}
-
- def execute(self, context):
- self.timer = context.window_manager.\
- event_timer_add(0.001, context.window)
- context.window_manager.modal_handler_add(self)
- return {'RUNNING_MODAL'}
-
- def cancel(self, context):
- bpy.context.scene.frame_set(bpy.context.scene.frame_current)
- context.window_manager.event_timer_remove(self.timer)
- return {'FINISHED'}
-
-
-class C3DImporter(bpy.types.Operator):
- """
- Load a C3D Marker Cloud
- """
- bl_idname = "import_anim.c3d"
- bl_label = "Import C3D"
-
- filepath: StringProperty(
- subtype='FILE_PATH',
- )
- Y_up: BoolProperty(
- name="Up vector is Y axis",
- default=False,
- description="Check when the data uses Y-up, uncheck when it uses Z-up",
- )
- from_inches: BoolProperty(
- name="Convert from inches to meters",
- default=False,
- description="Scale by 2.54/100",
- )
- scale: FloatProperty(
- name="Scale",
- default=1.0,
- description="Scale the positions by this value",
- min=0.0000001, max=1000000.0,
- soft_min=0.001, soft_max=100.0,
- )
- auto_scale: BoolProperty(
- name="Adjust scale automatically",
- default=False,
- description="Guess correct scale factor",
- )
- auto_magnitude: BoolProperty(
- name="Adjust scale magnitude",
- default=True,
- description="Automatically adjust scale magnitude",
- )
- create_armature: BoolProperty(
- name="Create an armature",
- default=True,
- description="Import the markers as bones instead of empties",
- )
- size: FloatProperty(
- name="Empty or bone size",
- default=.03,
- description="The size of each empty or bone",
- min=0.0001, max=1000000.0,
- soft_min=0.001, soft_max=100.0,
- )
- x_ray: BoolProperty(
- name="Use X-Ray",
- default=True,
- description="Show the empties or armature over other objects",
- )
- frame_skip: IntProperty(
- name="Fps divisor",
- default=1,
- description="Frame supersampling factor",
- min=1,
- )
- use_frame_no: BoolProperty(
- name="Use frame numbers",
- default=False,
- description="Offset start of animation according to the source",
- )
- show_names: BoolProperty(
- name="Show Names", default=False,
- description="Show the markers' name",
- )
- prefix: StringProperty(
- name="Name Prefix", maxlen=32,
- description="Prefix object names with this",
- )
- use_existing: BoolProperty(
- name="Use existing empties or armature",
- default=False,
- description="Use previously created homonymous empties or bones",
- )
- confidence: FloatProperty(
- name="Minimum Confidence Level", default=0,
- description="Only consider markers with at least "
- "this confidence level",
- min=-1., max=1000000.0,
- soft_min=-1., soft_max=100.0,
- )
-
- filter_glob: StringProperty(default="*.c3d;*.csv", options={'HIDDEN'})
-
- def find_height(self, ms):
- """
- Heuristic to find the height of the subject in the markerset
- (only works for standing poses and you must have correct data
- on the first frame)
- """
- zmin, zmax = None, None
- hidx = 1 if self.properties.Y_up else 2
- for ml in ms.markerLabels:
- # check if LTOE is a substring of this marker label
- if 'LTOE' in ml:
- # substitute the substring to get the head marker
- hd = ml.replace('LTOE', 'LFHD')
- if hd not in ms.markerLabels:
- break
- pmin_idx = ms.markerLabels.index(ml)
- pmax_idx = ms.markerLabels.index(hd)
- zmin = ms.frames[0][pmin_idx].position[hidx]
- zmax = ms.frames[0][pmax_idx].position[hidx]
- break
- if zmin is None: # could not find named markers, get extremes
- allz = [m.position[hidx] for m in ms.frames[0]]
- zmin, zmax = min(allz), max(allz)
- return abs(zmax - zmin) or 1
-
- def adjust_scale_magnitude(self, height, scale):
- mag = math.log10(height * scale)
- return scale * math.pow(10, -int(mag))
-
- def adjust_scale(self, height, scale):
- """
- Try to find the correct scale for some common configurations
- found in CMU's c3d files.
- """
- factor = height * scale / 1.75 # normalize
- if factor < 0.5:
- scale /= 10.0
- factor *= 10.0
- cmu_factors = [(1.0, 1.0), (1.1, 1.45), (1.6, 1.6), (2.54, 2.54)]
- sqerr, fix = min(
- ((cf[0] - factor) ** 2.0, 1.0 / cf[1])
- for cf in cmu_factors
- )
- return scale * fix
-
- def create_empties(self, ms):
- """
- Create the empties and get their collision-free names
- """
- unames = {}
- use_existing = self.properties.use_existing
- s = self.properties.size
- empty_size = (s, s, s)
- for ml in ms.markerLabels:
- name = self.properties.prefix + ml
- if use_existing and name in bpy.context.scene.objects:
- o = bpy.context.scene.objects[name]
- else:
- bpy.ops.object.add()
- o = bpy.context.active_object
- o.name = name
- unames[name] = o.name
- bpy.ops.transform.resize(value=empty_size)
- o.show_name = self.properties.show_names
- o.show_in_front = self.properties.x_ray
- for name in unames.values():
- bpy.context.scene.objects[name].select_set(True)
- return unames
-
- def create_armature_obj(self, ms, scale):
- """
- Create or use existing armature, return a bone dict,
- leave the armature in POSE mode
- """
- head_dir = Vector((0, 0, self.properties.size))
- ao = bpy.context.active_object
- # when using an existing armature we restrict importing
- # the markers only for existing bones
- if not self.properties.use_existing or not ao or ao.type != 'ARMATURE':
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list