So, I have the structure of a single vertebra (roughly) and an armature bone to dictate it's motion. What I want to know is, is there any way to generate a series of vertebrae, one on top of the other, with their armature bones already linked together? I REALLY don't want to place and link every single bone together, when there might be more than 50 of them. Also, I'd like the general scaling of each vertebra to be decreasing as each structure is generated. I know the array modifier can do the first part of that, but it doesn't copy the bones, and I don't know how to add scaling to it.
I would do it like this: - Create the first vertebra - Shift D Z to duplicate and move upward - Shift R to repeat the last operation - S for scaling the needed - at the end select all the vertebrae and ctrl J Join them - add a curve modifier to adjust the shape of the whole object
- Then create a single bone
- in edit mode extrude the bone moving the tip toward the top of the next vertebra
- extrude again ...
- at the end parent the object to the armature using automatic wheight
I think it can take half an hour for 50-60 pieces
Maybe for 5000 you would need an automated way
Remember also that a long bone can be subdivided n times, with the W key menu.
Better to use python for highly repetitive tasks like this. Here's a python script automate the generation of the bone and vertebrae pairs:
#Script assumes existence of "VertBone1" armature and "Vertebrae1" object with the "Vertebrae1" object parented to the "VertBone1" armature import bpy gapAmt = 0.1 scaleAmt = 0.9 numVertebraes = 6 #deselect all objects bpy.ops.object.select_all(action='TOGGLE') bpy.ops.object.select_all(action='DESELECT') for i in range(1, numVertebraes): #set our target object names boneName = str("VertBone"+str(i)) vertebraeName = str("Vertebrae"+str(i)) #iterate over all objects and select our target objects for o in bpy.data.objects: o.select = False if o.name == boneName or o.name == vertebraeName: o.select = True if o.name == vertebraeName: #get the height of the current vertebrae curVT = o.dimensions.z #duplicate both objects bpy.ops.object.duplicate(linked=False) newVert = bpy.data.objects[vertebraeName +".001"] newBone = bpy.data.objects[boneName +".001"] newVert.select = True newVert.name = "Vertebrae" + str(i+1) newBone.select = False #scale vertebrae object bpy.ops.transform.resize(value=(scaleAmt,scaleAmt,scaleAmt)) bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) newVert.select = False newBone.select = True newBone.name = "VertBone" + str(i+1) #set translation amount to equal height of current vertebrae plus gap amount moveAmt = curVT+gapAmt bpy.ops.transform.translate(value=(0, 0, moveAmt))
Note: each bone will be a separate armature. You may have to join them if you only want one armature.