A8 Ragdoll conversion from A7 - case study

Posted By: jcl

A8 Ragdoll conversion from A7 - case study - 08/06/10 14:10

We were asked to help fixing the A8 version of the A7 Ragdoll demo by Helghast. As this is a good example of the problems you can encounter when converting an A7 ODE project to A8 PhysX, I'm posting here our experiences as case study.

1. Continous collision detection

For speed reasons, PhysX does not use CCD by default. This causes very small objects, such as the tiny bones of the demo, to fall through the floor. So you need to activate CCD when tiny things move fast and collide with something.

Code:
// A7 physics initialization
	fps_max = 60;
	fps_min = 30;
	
	ph_iterations = 20; // set itterating physics to smooth out.
	ph_setgravity(vector(0, 0, -668)); // set gravity
	ph_setcorrections(9000, 0); // set physics corrections
	ph_setcollisions(1000, 20);


Code:
// A8 physics initialization for CCD
	physX_open();
	pX_setgravity(vector(0, 0, -9.81)); // set gravity
	pX_setccd(1);



2. Initialize physics objects

Begin with the default settings. They will suffice in most cases. Adjust them later if necessary. The mass is calculated automatically in A8.

Code:
// A7 physics object initialization
	set(entityMe, PASSABLE);
	phent_settype(entityMe, PH_RIGID, PH_BOX);
	phent_setmass(entityMe, mass, PH_BOX);
	phent_setfriction(entityMe, 15);
	phent_setdamping(entityMe, 35, 35);
	phent_setelasticity(entityMe, 35, 30); // bounciness
	reset(entityMe, PASSABLE);


Code:
// A8 physics object initialization with CCD
	pXent_settype(entityMe, PH_RIGID, PH_BOX);
	pXent_setccdskeleton(entityMe, nullvector, 1);



3. Initialize joints

In A8, joints are addressed through the entity pointer, not through a hinge handle, and have more parameters (for instance restitution, and break limits). When you don't need a break limit, pass NULL for the vector parameter. Passing nullvector would set the break limits to 0. And don't join an object with itself! This will cause a crash, just as in real life.

Code:
// A7 hinge initialization
	var tempHinge;
	// make constraint
	tempHinge = phcon_add(PH_HINGE, constr_1, constr_2); // attach to bodypart
	phcon_setparams1(tempHinge, constr_1.x, RD_Hinge1, nullvector); // set hinge limits
	phcon_setparams2(tempHinge, RD_Hinge2, nullvector, nullvector);



Code:
// A8 hinge initialization
	// make constraint
	pXcon_add(PH_HINGE, constr_1, constr_2, 0); // attach to bodypart
	pXcon_setparams1(constr_1, constr_1.x, RD_Hinge1, NULL); // set hinge limits
	pXcon_setparams2(constr_1, RD_Hinge2, NULL, NULL); // same



4. Reading object positions

Don't disable or enable objects for reading their positions in A8. First, it is not necessary. Second, you can't displace objects that are attached to joints, so disabling an object requires removing its joints first. You don't want to do that for a ragdoll.

Code:
// A7
	pXent_enable(limb, 0);
	vec_for_bone(limb.x, actor, boneBlend); // place at right position
	ang_for_bone(limb.pan, actor, boneBlend); // rotate by right angle
	pXent_enable(limb, 1);



Code:
// A8
	vec_for_bone(limb.x, actor, boneBlend); // place at right position
	ang_for_bone(limb.pan, actor, boneBlend); // rotate by right angle




Posted By: Helghast

Re: A8 Ragdoll conversion from A7 - case study - 08/06/10 14:44

Thanks alot for this!
I'm going to update my header, and create a ragdoll Demo out of it (one that actually looks good hopefully :P).

most of this I had converted already, except for the CCD stuff, and the pelvis hinge.
Would you say though creating a PH_6DJOINT is better/more effective for ragdolls?

regards,
Posted By: jcl

Re: A8 Ragdoll conversion from A7 - case study - 08/06/10 14:50

Yes, 6DJOINT has the advantage that you can add spring elements, simulating the resistance of muscles and tendons. But you need to read the nVidia documentation for learning all possibilities of 6D joints. It's a lot of pages and didn't fit into our manual.
Posted By: Helghast

Re: A8 Ragdoll conversion from A7 - case study - 08/06/10 14:54

Originally Posted By: jcl
Yes, 6DJOINT has the advantage that you can add spring elements, simulating the resistance of muscles and tendons. But you need to read the nVidia documentation for learning all possibilities of 6D joints. It's a lot of pages and didn't fit into our manual.


That's no problem, im used to reading alot of documentation, I will go ahead and take a look at this, and possibly convert it at a later point. For now I think the Demo would be a bigger use to the community.

Another question, how does the speed of a collision type of PH_BOX vs PH_CAPSULE hold up against each other? I feel humanoid ragdolls would benefit from using capsules rather then using boxes, am I right in this case?
Posted By: Quad

Re: A8 Ragdoll conversion from A7 - case study - 08/06/10 18:12

there are some really good pieces of small tips on that post, i suggest this to be either sticky or go in to the a7->a8 part of manual/aum.
Posted By: jcl

Re: A8 Ragdoll conversion from A7 - case study - 08/06/10 18:26

I'll make it sticky. - PH_BOX is faster than PH_CAPSULE, and is normally sufficient for a ragdoll bone. PH_CAPSULE is mostly used for character controllers.
Posted By: yorisimo

Re: A8 Ragdoll conversion from A7 - case study - 08/13/10 15:38

How do we make a motorized hinge joint in A8? (In A7 we could just use phcon_setmotor, but a similar function does not exist in A8) I would be OK using the more complicated 6D joint if that is the solution. Are joint motors/springs/dampers implemented yet in A8: in the manual under pXcon_set6djoint it says that JointDrive[6] is unused.

I am having trouble finding the PhysX SDK Manual. Does anyone have a copy they can send me? It seems NVIDIA is delayed in giving developers access to the PhysX SDK. I don't necessarily want the source code, just the manual.

How are swing1Motion, swing2Motion and twistMotion defined (about local/global x, y, an z axes?)

EDIT: testing it out... looks like swing1Motion is pan (z), swing2Motion is tilt (-y) and twistMotion is roll (x) relative to bodies starting orientations. I think the documentation would be a lot more clear if it used the standard Gamestudio descriptions pan/tilt/roll than the non descriptive swing1/swing2/twist

What I don't understand is why the 6D Joint needs a Rotation Axis parameter defined by pX_setparams1 (Parameter 2), since the axes are defined using pXcon_set6djoint. I also don't understand why Parameter 4 sets both swing1 and swing2 limit in the x and y parameters, whereas Parameter 5 sets the lower and upper limit of twist in the x and y parameters. How do you set the lower and upper limits independently for swing1/swing2? For Parameter 6, shouldn't you be able to set the x,y,and z linear limits independently?

Also, will pXcon_getposition support the 6D Joint as well? There would be up to 6 values (x,y,z,pan,tilt,roll) that it would need to return

Thanks
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 10/03/10 08:36

So, did somebody made it???
Posted By: HeelX

Re: A8 Ragdoll conversion from A7 - case study - 10/17/10 21:35

I'm also interested in this... Helgast? Anyone??
Posted By: Helghast

Re: A8 Ragdoll conversion from A7 - case study - 10/18/10 09:34

Originally Posted By: HeelX
I'm also interested in this... Helgast? Anyone??


Due to deadlines at work, and freelance contracts which have my priority, I have been unable as of yet to convert this properly.
I cant tell yet either when exactly I will have it done... as the coming 6 weeks I'm gonna be crunching at the project at work.

regards,
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 08:13

Im done converting.
Works good, should I make a demo?
Posted By: gri

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 08:44


hi,

yeah I want to see the action.
Posted By: Dark_samurai

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 09:05

Yeah would be cool!
Posted By: Pappenheimer

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 10:08

Sure!
Including converted source code! laugh
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 13:17

Ok, just a second grin
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 13:21

Ok, the code itself is fine, but how I set the bones in the model is very crapy...
So please don`t reminde grin
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 15:07

Ok here is it;
download link

Please don`t tell me that the ragdolls are ugly!
Setting bones in the right place is not my strenght grin
Posted By: painkiller

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 15:15

mm I hoped at least some credits of my converted code lol
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 12/01/10 15:25

Oh, thanks painkiller I allmost forgot.
It`s converted by painkiller grin

Sorry wink
Posted By: gri

Re: A8 Ragdoll conversion from A7 - case study - 12/02/10 08:48


hey,

thank you for your work.
I will take a look at your template at lunchtime.

regards,
maik
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 12/02/10 14:43

No problem grin
Posted By: rayp

Re: A8 Ragdoll conversion from A7 - case study - 06/27/11 17:26

Ive downloaded the archive and startet the exe file. I get an error message saying: "Cant initialize PhysX" ...whats that ?

Edit: Maybe i should install PhysX before grin
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 02/01/12 17:06

Are there any good ragdoll examples out there? (made with physX)
Posted By: painkiller

Re: A8 Ragdoll conversion from A7 - case study - 02/01/12 17:15

in AUM 100 there is a ragdoll code example made by Rojart
Posted By: 3run

Re: A8 Ragdoll conversion from A7 - case study - 02/01/12 23:30

but it doesn't blend from animations, right?
Posted By: darkinferno

Re: A8 Ragdoll conversion from A7 - case study - 02/02/12 00:50

Originally Posted By: 3run
but it doesn't blend from animations, right?

didnt helghast add that feature from A7 days ?
Posted By: 3run

Re: A8 Ragdoll conversion from A7 - case study - 02/02/12 08:59

I meant example from AUM 100, not the one which was made by Helghast.
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 03/05/12 20:02

Nop, it doesn`t...
I would also be interested in a ragdoll code (physX), which blends in from animations.
Were can I find the code from Helghast? Maby we can convert it to physX?
Posted By: Ch40zzC0d3r

Re: A8 Ragdoll conversion from A7 - case study - 03/05/12 20:37

There are ragdolls for newton too?
Newton is awesome, in my opinion much more reslistic than physx.
But physx is faster!
Posted By: Random

Re: A8 Ragdoll conversion from A7 - case study - 03/06/12 21:01

There are some weird problems with the converted ragdoll code.
example:
video of the problem

And if you want to test it:
download

Anybody has an idea what is going on?
Posted By: Ch40zzC0d3r

Re: A8 Ragdoll conversion from A7 - case study - 03/14/12 15:44

I just use another model with other bone-names and some other placed bones. Now when it comes to ragdolls, its looking, ... SHIT!
The arms are like a bow, the legs are too long. I just changed the enemy.mdl model + the code...
Please help frown

Code:
RD_blendPose(Pelvis, you, "Bip01");
RD_blendPose(L_leg_up, you, "Bip01_L_Thigh");
RD_blendPose(L_leg_down, you, "Bip01_L_Calf");
RD_blendPose(R_leg_up, you, "Bip01_R_Thigh");
RD_blendPose(R_leg_down, you, "Bip01_R_Calf");
RD_blendPose(Stomach, you, "Bip01_Spine2"); //Bip01_Spine1
RD_blendPose(Torso, you, "Bip01_Spine3");
RD_blendPose(L_arm_up, you, "Bip01_L_UpperArm");
RD_blendPose(L_arm_down, you, "Bip01_L_Forearm");
RD_blendPose(R_arm_up, you, "Bip01_R_UpperArm");
RD_blendPose(R_arm_down, you, "Bip01_R_Forearm");
RD_blendPose(Head, you, "Bip01_Head");

while(you) {
// set pelvis to right position
vec_set(you.x, my.x);
vec_set(you.pan, my.pan);

// update all physics (limb) parts
RD_updateBoneHinge(L_leg_up, "Bip01_L_Thigh", you);
RD_updateBoneHinge(L_leg_down, "Bip01_L_Calf", you);
RD_updateBoneHinge(R_leg_up, "Bip01_R_Thigh", you);
RD_updateBoneHinge(R_leg_down, "Bip01_R_Calf", you);
RD_updateBoneHinge(Stomach, "Bip01_Spine2", you);
RD_updateBoneHinge(Torso, "Bip01_Spine3", you);
RD_updateBoneHinge(L_arm_up, "Bip01_L_UpperArm", you);
RD_updateBoneHinge(L_arm_down, "Bip01_L_Forearm", you);
RD_updateBoneHinge(R_arm_up, "Bip01_R_UpperArm", you); 
RD_updateBoneHinge(R_arm_down, "Bip01_R_Forearm", you);
RD_updateBoneHinge(Head, "Bip01_Head", you);

wait(1);
}



Model DL: http://www.mediafire.com/?7fik1mq3btaow3e
Posted By: Ch40zzC0d3r

Re: A8 Ragdoll conversion from A7 - case study - 03/16/12 21:10

Nobody wanna help me?
Really nice from you...
© 2024 lite-C Forums