Trying to make a spine-like structure in blender

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

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.