Quote: "I'm curious how you'd go about setting up your models for ragdoll physics. Does it just use the bone information from the model? "
Yes, it uses the model's bones.
There is one prerequisite, the model must have all of it's bones rotations zeroed in its first frame of animation/default pose.
Most modeling software zeroes the rotations of the rig when you finish creating it.
The Zombie model we used in the demo is a FPSC pack model.
It did not have it's rotations zeroed, but we zeroed them with Fragmotion.
It is really simple to zero them and keep the animations intact.
I am making a video of how to do that in Fragmotion.
We added an extra bone below the pelvis so that when we create the ragdoll physics capsule that represents the pelvis it will be the right size.
We are creating a workflow so it will be easy to create a ragdoll for any model even non human.
The ragdoll skeleton is made up of capsules, you pick two bones in the model and it will create a physics capsule between them.
Next you pick two ragdoll bones that you have created and create a joint between them.
DBPro code for zombie model ragdoll.
function CreateRagdoll(objID as integer)
local objFrame as integer
objFrame = object frame(objID)
if object playing(objID) = 1 then stop object objID
bphys_ragdollbegin objID, 175.0
//Create the ragdoll bones using the original objects bone positions then add all the original objects bones that will be moved by the ragdoll bone.
//Set collisions groups so bones won't collide with other bones.
Pelvis = bphys_ragdolladdbone(get limb by name(objID, "Crotch"), get limb by name(objID, "Bip01_Spine"),10,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid Pelvis, get limb by name(objID, "Bip01_Pelvis")
bphys_ragdollboneaddlimbid Pelvis, get limb by name(objID, "Crotch")
Torso = bphys_ragdolladdbone(get limb by name(objID, "Bip01_Spine"), get limb by name(objID, "Bip01_Neck"), 12,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid Torso, get limb by name(objID, "Bip01_Spine")
bphys_ragdollboneaddlimbid Torso, get limb by name(objID, "Bip01_Spine1")
bphys_ragdollboneaddlimbid Torso, get limb by name(objID, "Bip01_Spine2")
bphys_ragdollboneaddlimbid Torso, get limb by name(objID, "Bip01_L_Clavicle")
bphys_ragdollboneaddlimbid Torso, get limb by name(objID, "Bip01_R_Clavicle")
Head = bphys_ragdolladdbone(get limb by name(objID, "Bip01_Neck"), get limb by name(objID, "Bip01_HeadNub"), 7,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid Head, get limb by name(objID, "Bip01_Neck")
bphys_ragdollboneaddlimbid Head, get limb by name(objID, "Bip01_Head")
bphys_ragdollboneaddlimbid Head, get limb by name(objID, "Bip01_Ponytail1")
bphys_ragdollboneaddlimbid Head, get limb by name(objID, "Bip01_HeadNub")
L_UpperArm = bphys_ragdolladdbone(get limb by name(objID, "Bip01_L_UpperArm"), get limb by name(objID, "Bip01_L_Forearm"), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid L_UpperArm, get limb by name(objID, "Bip01_L_UpperArm")
L_Forearm = bphys_ragdolladdbone(get limb by name(objID, "Bip01_L_Forearm"), get limb by name(objID, "Bip01_L_Hand"), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid L_Forearm, get limb by name(objID, "Bip01_L_Forearm")
`bphys_ragdollboneaddlimbid L_Forearm, get limb by name(objID, "Bip01_L_Hand")
`bphys_ragdollboneaddlimbid L_Forearm, get limb by name(objID, "Bip01_L_Finger0")
L_Hand = bphys_ragdolladdbone(get limb by name(objID, "Bip01_L_Hand"), get limb by name(objID, "Bip01_L_Finger0Nub"), 4,eBphys_CollisionGroup.group0,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid L_Hand, get limb by name(objID, "Bip01_L_Hand")
bphys_ragdollboneaddlimbid L_Hand, get limb by name(objID, "Bip01_L_Finger0")
bphys_ragdollboneaddlimbid L_Hand, get limb by name(objID, "Bip01_L_Finger0Nub")
bphys_ragdollboneaddlimbid L_Hand, get limb by name(objID, "FIRESPOT")
L_Thigh = bphys_ragdolladdbone(get limb by name(objID, "Bip01_L_Calf" ), get limb by name(objID, "Bip01_L_Thigh" ), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid L_Thigh, get limb by name(objID, "Bip01_L_Thigh")
L_Calf = bphys_ragdolladdbone(get limb by name(objID, "L_Heel"), get limb by name(objID, "Bip01_L_Calf"), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid L_Calf, get limb by name(objID, "Bip01_L_Calf")
bphys_ragdollboneaddlimbid L_Calf, get limb by name(objID, "Bip01_L_Foot")
bphys_ragdollboneaddlimbid L_Calf, get limb by name(objID, "L_Heel")
R_UpperArm = bphys_ragdolladdbone(get limb by name(objID, "Bip01_R_UpperArm"), get limb by name(objID, "Bip01_R_Forearm"), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid R_UpperArm, get limb by name(objID, "Bip01_R_UpperArm")
R_Forearm = bphys_ragdolladdbone(get limb by name(objID, "Bip01_R_Forearm"), get limb by name(objID, "Bip01_R_Hand"), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid R_Forearm, get limb by name(objID, "Bip01_R_Forearm")
`bphys_ragdollboneaddlimbid R_Forearm, get limb by name(objID, "Bip01_R_Hand")
`bphys_ragdollboneaddlimbid R_Forearm, get limb by name(objID, "Bip01_R_Finger0")
R_Hand = bphys_ragdolladdbone(get limb by name(objID, "Bip01_R_Hand"), get limb by name(objID, "Bip01_R_Finger0Nub"), 4,eBphys_CollisionGroup.group0,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid R_Hand, get limb by name(objID, "Bip01_R_Hand")
bphys_ragdollboneaddlimbid R_Hand, get limb by name(objID, "Bip01_R_Finger0")
bphys_ragdollboneaddlimbid R_Hand, get limb by name(objID, "Bip01_R_Finger0Nub")
R_Thigh = bphys_ragdolladdbone(get limb by name(objID, "Bip01_R_Calf" ), get limb by name(objID, "Bip01_R_Thigh"), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid R_Thigh, get limb by name(objID, "Bip01_R_Thigh")
R_Calf = bphys_ragdolladdbone(get limb by name(objID, "R_Heel"), get limb by name(objID, "Bip01_R_Calf"), 5,eBphys_CollisionGroup.group1,eBphys_CollisionMask.mask0 + eBphys_CollisionMask.mask1 + eBphys_CollisionMask.mask2)
bphys_ragdollboneaddlimbid R_Calf, get limb by name(objID, "Bip01_R_Calf")
bphys_ragdollboneaddlimbid R_Calf, get limb by name(objID, "Bip01_R_Foot")
bphys_ragdollboneaddlimbid R_Calf, get limb by name(objID, "R_Heel")
if SwitchToSpike = TRUE
GunRayjointID = FireSpikeGunRay()
else
GunRayjointID = FireRegularGunRay()
endif
if GunRayjointID > -1
CurrrentController = -1
bphys_charactercontrollerdelete objID
//Now we create a joint between the bones we created , joints are positioned at the original objects joints and set the rotation and limits.
//neck
bphys_ragdolladdtwistjoint Torso, Head, get limb by name(objID, "Bip01_Neck"),NeckJoint.rotationVec3, NeckJoint.limitsVec3
//Waist
bphys_ragdolladdhingejoint Pelvis, Torso, get limb by name(objID, "Bip01_Spine"), WaistJoint.rotationVec3, WaistJoint.limitsVec2
//Left Shoulder cone
bphys_ragdolladdtwistjoint Torso, L_UpperArm, get limb by name(objID, "Bip01_L_UpperArm"), LeftShoulderJoint.rotationVec3, LeftShoulderJoint.limitsVec3
//Left elbow hinge
bphys_ragdolladdhingejoint L_UpperArm, L_Forearm, get limb by name(objID, "Bip01_L_Forearm"), LeftElbowJoint.rotationVec3, LeftElbowJoint.limitsVec2
//right elbow hinge
bphys_ragdolladdhingejoint R_UpperArm, R_Forearm, get limb by name(objID, "Bip01_R_Forearm"), RightElbowJoint.rotationVec3, RightElbowJoint.limitsVec2
//Left Wrist Hinge
bphys_ragdolladdhingejoint L_Forearm, L_Hand, get limb by name(objID, "Bip01_L_Hand"), leftWristJoint.rotationVec3, leftWristJoint.limitsVec2
//right wrist hinge
bphys_ragdolladdhingejoint R_Forearm, R_Hand, get limb by name(objID, "Bip01_R_Hand"), rightWristJoint.rotationVec3, rightWristJoint.limitsVec2
//Left hip cone
bphys_ragdolladdtwistjoint Pelvis, L_Thigh, get limb by name(objID, "Bip01_L_Thigh"), HipJoint.rotationVec3, HipJoint.limitsVec3
//right Shoulder cone
bphys_ragdolladdtwistjoint Torso, R_UpperArm, get limb by name(objID, "Bip01_R_UpperArm"), RightShoulderJoint.rotationVec3, RightShoulderJoint.limitsVec3
//right hip cone
bphys_ragdolladdtwistjoint Pelvis, R_Thigh, get limb by name(objID, "Bip01_R_Thigh"), HipJoint.rotationVec3, HipJoint.limitsVec3
//Left knee hinge
bphys_ragdolladdhingejoint L_Thigh, L_Calf, get limb by name(objID, "Bip01_L_Calf"), KneeJoint.rotationVec3, KneeJoint.limitsVec2
//right knee hinge
bphys_ragdolladdhingejoint R_Thigh, R_Calf, get limb by name(objID, "Bip01_R_Calf"), KneeJoint.rotationVec3, KneeJoint.limitsVec2
SetRagdollProperties()
bphys_ragdollend
temp = bphys_ragdollhidebones(objID)
array insert at bottom Ragdolls().ID
Ragdolls().ID = objID
`tg set active object 0
selectedObj = 0
if SwitchToSpike = TRUE
if GunRayjointID > -1
UpdateSpikeGunRay(GunRayjointID)
endif
endif
`CreatePickJointsforHands(objID)
// TODO: Delete Character Controller
else
bphys_ragdollend
if bphys_deleteragdoll(objID) = TRUE
loop object objID, objFrame
endif
endif
endfunction
Basically you call ragdoll begin and set the overall weight of your model.
Create your ragdoll bones.
Create the joints between them.
Set some properties of your ragdoll.
Then ragdoll end.
The weight you set for your model gets divided up between all the ragdoll bones based on volume.
You can create a ragdoll at any frame of animation.
All ragdolls are automatically updated when the physics world is updated. Once your ragdoll stops moving DBPro culling is updated.
With ray casting you can detect ragdoll limb hits and apply a physics force at that location.
[img]

[/img]





WindowsXP SP3,Vista,Windows 7 SP1, DBpro v7.7RC7
Stab In The Dark Editor
The coffee is lovely dark and deep,and I have code to write before I sleep.