6
$\begingroup$

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.

$\endgroup$
1
$\begingroup$

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.

| improve this answer | |
$\endgroup$
0
$\begingroup$

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))

enter image description here

Note: each bone will be a separate armature. You may have to join them if you only want one armature.

| improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.