- 1 Blender 2.73: Add-ons
- 1.1 Import/Export
- 1.2 Python API
Blender 2.73: Add-ons
Add-on improvments include: Some great compatibility fixes for the Collada Importer, the FBX Add-on got some advanced handling/tweaking options for importing and exporting armatures and version 2.0 of the Copy and Paste Add-on has been implemented.
Joints & Bones
Collada does not support the concept of Bones like in Blender. Instead of this we only have Joints. A Joint is equivalent to the Head of a Blender Bone:
Because of this the Bone Tail is not defined when a Collada File is imported. For subsequent bones (bone chains) this is normally not a big problem because a parent's bone tail is typically connected to a child's Bone Head, so the bones can be recreated from the data.
The Dangling Bone Tail
But this is no longer true for the leaf bones (the end bone of a bone chain). There we always end up with a "dangling tail". In many cases we can derive the bone orientation from the Joint Transformation Matrix that is provided in the Collada Import. However, this keeps us with a bone of correct rotation but arbitrary length.
We solve the bone length problem by detecting the smallest bone in the Armature and take that as a measure for the leaf bone length. This is done automatically by the Importer and in most cases this approach still gives convenient results.
When Collada Does Not Care
Sometimes the leaf bones are exported with a wrong or missing transformation matrix. In that case all Leaf bones might point into unwanted directions. We found that aligning the leaf bones towards their parent bones gives reasonable results in these cases. So the Importer now provides an Option "Fix Leaf Bones"
Connected and Unconnected Bones
Collada does only know about Parent-Child relationship regarding Bones. However blender supports also connected/unconnected Bones. It is not straight forward to find which bones shall be connected and which bones shall be left unconnected.
By default Blender only connects 2 bones if the parent bone has exactly one single child bone. This can give us inconvenient results like in the example aside. Here the problem is that each Bone of the main Skeleton has one additional child bone (a collision Volume Bone in this case). Hence because of the connection rule above, no bones are actually connected and we get a very inconvenient Rig.
We have added an experimental option to the Importer "Find Bone Chains". This option searches "best matching" chains of bones, so that whenever a Parent has multiple children, it determines which is the most reasonable bone chain to create.
The Bone Chain Finder works best for symmetric Rigs. For asymmetric rigs it does not work well at all. Because of this the chain finder is p[rovided as an option and it is disabled by default.
Where is it ?
You find the new options in the Collada Import Panel:
Fix Leaf Bones
Orient the Leaf bones along their parent bones.
Find Bone Chains:
Try to find best matching chains of connected bones.
Minimum Chain Length:
Controls what size a child bone chain must have at least to be considered as possible subsequent chain for a bone. Actually we haven't yet found any situation where changing the default value would give better results.
Features available in the 'experimental' version of the add-on in 2.72 have been merged into the 'stable' one, and experimental removed. This mostly adds some advanced handling/tweakings of armatures import/export (like auto-orientation of bones, add/remove leaf bones, etc.), to address differences between Blender's and FBX's armature models.
- Import: first imported animation/action is now linked to its object (or shapekey, b83c1181425).
- BMVert/Edge/FaceSeq.ensure_lookup_table now needs to be called before int subscription (785b90d7efd0)
bm.verts.ensure_lookup_table(); v = bm.verts[i]
bm.edges.ensure_lookup_table(); e = bm.edges[i]
bm.faces.ensure_lookup_table(); f = bm.faces[i]
- Grease Pencil data is now created on the Scene instead of per Object by default. However, old files may still have Grease Pencil data on Object level which will get used instead. There are two ways this can be worked around:
if ob: gpd = ob.grease_pencil; if not gpd: gpd = scene.grease_pencil
gpd = context.gpencil_data