Armature Extension to Animation Nodes

I’m attempting to create some additional nodes for the Animation Nodes add-on which allow me to describe a kinematic structure with nodes, with the code inside handling the details of implementing this in an armature.

The short story. Can I…

  1. Edit an armature (bones: add, move, set parents…) without going into edit mode (to access the edit_bones objects?
  2. Create a node for Animation Nodes that isn’t run repeatedly all the time but only when something in the node tree has changed?

The long story…
My prototype (script to run straight from the text editor) works great.

import bpy
from mathutils import Vector

# select the armature to work with
obj = bpy.data.objects['ArmatureObject']
arm = obj.data

bpy.ops.object.mode_set(mode='EDIT')

for bone in arm.edit_bones:
	arm.edit_bones.remove(bone)

root = arm.edit_bones.new('root')
root.head = [0, 0, 0]
root.tail = [0, 0, 1]

bone1 = arm.edit_bones.new('bone1')
bone1.head = root.tail
bone1.tail = bone1.head + Vector([0 , 1.5, 1]) # fixed in armaturelocal coords
bone1.parent = root
bone1.use_connect = True
bone1.use_inherit_scale = False

bone2 = arm.edit_bones.new('bone2')
bone2.head = bone1.tail
bone2.tail = bone1.matrix*(Vector([0, bone1.length, 0]) + Vector([0, 1, 0])) # relative to bone1! Puts the new tail along that second vector but in the coordinate frame of bone1
bone2.parent = bone1
bone2.use_connect = True
bone2.use_inherit_scale = False
bone2.align_roll(Vector([1, 0, 0])) # TODO need to think more about this one

# back to object mode
bpy.ops.object.mode_set(mode='OBJECT')

So I started trying to implement these as custom new nodes for Animation Nodes, starting with a node that “resets” the armature so that the subsequent nodes will each add a couple bones. But this is being re-run all the time - not only CPU inefficient, but also the constant switching between object and edit mode prevents me from switching the armature to pose mode to work with it. (also it turns out I’m not selecting the armature so bpy.ops knows about it so the node tree crashes if I select any other objects). So I’m hoping that there’s a way to not have to change the armature into Edit Mode to change the bones… or there’s some way to have Animation Nodes not run al the time, but only when there’s a change to the node tee.

Anybody have ideas on this? Thanks,

import bpy
from ... base_types import AnimationNode

class ArmInit(bpy.types.Node, AnimationNode):
	bl_idname = "an_ArmInitNode"
	bl_label = "Armature Init"

	def create(self):
		#               Type      Name   Identifier
		self.newInput("Object", "Armature Object", "obj")
		

	def execute(self, obj):
		if obj is None:
			return
		
		bpy.ops.object.mode_set(mode='EDIT')

		for bone in obj.data.edit_bones:
			obj.data.edit_bones.remove(bone)

		root = obj.data.edit_bones.new('root')
		root.head = [0, 0, 0]
		root.tail = [0, 0, 1]

		bpy.ops.object.mode_set(mode='OBJECT')

I don’t think so… But I have never tried it.

Set AN to execute only on node tree change:

24

I don’t have any more time to help specifically just now, hope this gets you started.

Cheers, Clock. :beers:

Perfect, thank you!

In case anybody is wondering - the ‘tree changed’ checkbox is in the tools panel (T) on the Animation Nodes tab in the node editor.

1 Like