@@ -45,6 +45,7 @@ namespace era_engine::physics
4545 mat4 model = mat4::identity,
4646 float r = 0 .5f ,
4747 mat4 rotation = mat4::identity,
48+ float hm = 1 .0f ,
4849 float mass = 1 .0f )
4950 {
5051 const auto & physics = physics_holder::physicsRef;
@@ -54,15 +55,15 @@ namespace era_engine::physics
5455 vec3 parentPos = bindPosWs (joints[parentIdx].bindTransform , model);
5556 vec3 childPos = bindPosWs (joints[childIdx].bindTransform , model);
5657
57- float len = length (parentPos - childPos);
58+ vec3 offset = parentPos - childPos;
59+ float len = length (offset);
5860
59- // shorten by 0.1 times to prevent overlap
60- len -= len * 0 .1f ;
61+ if (len - 2 .0f * r > 0 .1f )
62+ len = len - 2 .0f * r;
63+ else
64+ len *= 0 .9f ;
6165
62- if (len - 2 .0f * r > 0 )
63- len = len - r;
64-
65- float halfHeight = len / 2 .0f ;
66+ float halfHeight = hm * len / 2 .0f ;
6667
6768 vec3 bodyPos = (parentPos + childPos) / 2 .0f ;
6869
@@ -104,6 +105,7 @@ namespace era_engine::physics
104105 mat4 model = mat4::identity,
105106 float r = 0 .5f ,
106107 mat4 rotation = mat4::identity,
108+ float hm = 1 .0f ,
107109 float mass = 1 .0f )
108110 {
109111 const auto & physics = physics_holder::physicsRef;
@@ -112,7 +114,7 @@ namespace era_engine::physics
112114
113115 vec3 parentPos = (bindPosWs (joints[parentIdx].bindTransform , model) + offset);
114116
115- PxShape* shape = physics->getPhysics ()->createShape (PxCapsuleGeometry (r, l / 2 .0f ), *material);
117+ PxShape* shape = physics->getPhysics ()->createShape (PxCapsuleGeometry (r, hm * l / 2 .0f ), *material);
116118
117119 PxTransform local (createPxQuat (mat4ToTRS (rotation).rotation ));
118120 shape->setLocalPose (local);
@@ -168,7 +170,7 @@ namespace era_engine::physics
168170 return body;
169171 }
170172
171- static void createD6Joint (
173+ static PxD6Joint* createD6Joint (
172174 PxRigidDynamic* parent,
173175 PxRigidDynamic* child,
174176 ref<animation::animation_skeleton> skeleton,
@@ -189,7 +191,7 @@ namespace era_engine::physics
189191
190192 joint->setConstraintFlag (PxConstraintFlag::eVISUALIZATION, true );
191193
192- configD6Joint ( 3 . 14f / 4 . f , 3 . 14f / 4 . f , - 3 . 14f / 8 . f , 3 . 14f / 8 . f , joint) ;
194+ return joint;
193195 }
194196
195197 static void createRevoluteJoint (
@@ -231,6 +233,16 @@ namespace era_engine::physics
231233 {
232234 }
233235
236+ static constexpr float HEAD_MASS_PERCENTAGE = 0 .0826f ;
237+ static constexpr float BODY_UPPER_MASS_PERCENTAGE = 0 .204f ;
238+ static constexpr float BODY_LOWER_MASS_PERCENTAGE = 0 .204f ;
239+ static constexpr float ARM_MASS_PERCENTAGE = 0 .07f ;
240+ static constexpr float FOREARM_MASS_PERCENTAGE = 0 .0467f ;
241+ static constexpr float HAND_MASS_PERCENTAGE = 0 .0065f ;
242+ static constexpr float UP_LEG_MASS_PERCENTAGE = 0 .085f ;
243+ static constexpr float LEG_MASS_PERCENTAGE = 0 .0475f ;
244+ static constexpr float FOOT_MASS_PERCENTAGE = 0 .014f ;
245+
234246 void px_ragdoll_component::initRagdoll (ref<animation::animation_skeleton> skeletonRef)
235247 {
236248 using namespace animation ;
@@ -272,6 +284,8 @@ namespace era_engine::physics
272284 uint32_t j_hand_r_idx = skeleton->nameToJointID [" hand_r" ];
273285 uint32_t j_middle_01_r_idx = skeleton->nameToJointID [" middle_01_r" ];
274286
287+ float mass = 100 .0f ;
288+
275289 transforms.resize (joints.size ());
276290
277291 ragdoll->initialBodyPos .resize (joints.size ());
@@ -291,15 +305,31 @@ namespace era_engine::physics
291305
292306 PxRigidDynamic* pelvis = createCapsuleBone (
293307 j_pelvis_idx,
294- j_neck_01_idx ,
308+ j_spine_03_idx ,
295309 *ragdoll,
296310 material,
297311 skeleton,
298312 modelWithoutScale,
299313 modelOnlyScale,
300314 model,
301315 15 .0f * scale,
302- rot);
316+ rot,
317+ 0 .8f );
318+ finishBody (pelvis, mass * BODY_LOWER_MASS_PERCENTAGE, 1 .0f );
319+
320+ PxRigidDynamic* upperSpine = createCapsuleBone (
321+ j_spine_02_idx,
322+ j_neck_01_idx,
323+ *ragdoll,
324+ material,
325+ skeleton,
326+ modelWithoutScale,
327+ modelOnlyScale,
328+ model,
329+ 13 .0f * scale,
330+ rot,
331+ 0 .4f );
332+ finishBody (upperSpine, mass * BODY_UPPER_MASS_PERCENTAGE, 1 .0f );
303333
304334 PxRigidDynamic* head = createCapsuleBone (
305335 j_head_idx,
@@ -313,6 +343,7 @@ namespace era_engine::physics
313343 model,
314344 6 .0f * scale,
315345 rot);
346+ finishBody (head, mass * HEAD_MASS_PERCENTAGE, 1 .0f );
316347
317348 PxRigidDynamic* l_leg = createCapsuleBone (
318349 j_thigh_l_idx,
@@ -325,6 +356,7 @@ namespace era_engine::physics
325356 model,
326357 8 .0f * scale,
327358 rot);
359+ finishBody (l_leg, mass * LEG_MASS_PERCENTAGE, 1 .0f );
328360
329361 PxRigidDynamic* r_leg = createCapsuleBone (
330362 j_thigh_r_idx,
@@ -337,30 +369,33 @@ namespace era_engine::physics
337369 model,
338370 8 .0f * scale,
339371 rot);
372+ finishBody (r_leg, mass * LEG_MASS_PERCENTAGE, 1 .0f );
373+
374+ PxRigidDynamic* l_calf = createCapsuleBone (
375+ j_calf_l_idx,
376+ j_foot_l_idx,
377+ *ragdoll,
378+ material,
379+ skeleton,
380+ modelWithoutScale,
381+ modelOnlyScale,
382+ model,
383+ 7 .0f * scale,
384+ rot);
385+ finishBody (l_calf, mass * LEG_MASS_PERCENTAGE, 1 .0f );
340386
341- // PxRigidDynamic* l_calf = createCapsuleBone(
342- // j_calf_l_idx,
343- // j_foot_l_idx,
344- // *ragdoll,
345- // material,
346- // skeleton,
347- // modelWithoutScale,
348- // modelOnlyScale,
349- // model,
350- // 7.0f * scale,
351- // rot);
352-
353- // PxRigidDynamic* r_calf = createCapsuleBone(
354- // j_calf_r_idx,
355- // j_foot_r_idx,
356- // *ragdoll,
357- // material,
358- // skeleton,
359- // modelWithoutScale,
360- // modelOnlyScale,
361- // model,
362- // 7.0f * scale,
363- // rot);
387+ PxRigidDynamic* r_calf = createCapsuleBone (
388+ j_calf_r_idx,
389+ j_foot_r_idx,
390+ *ragdoll,
391+ material,
392+ skeleton,
393+ modelWithoutScale,
394+ modelOnlyScale,
395+ model,
396+ 7 .0f * scale,
397+ rot);
398+ finishBody (r_calf, mass * LEG_MASS_PERCENTAGE, 1 .0f );
364399
365400 PxRigidDynamic* l_arm = createCapsuleBone (
366401 j_upperarm_l_idx,
@@ -372,6 +407,8 @@ namespace era_engine::physics
372407 modelOnlyScale,
373408 model,
374409 8 .0f * scale);
410+ finishBody (l_arm, mass * ARM_MASS_PERCENTAGE, 1 .0f );
411+
375412
376413 PxRigidDynamic* r_arm = createCapsuleBone (
377414 j_upperarm_r_idx,
@@ -383,28 +420,31 @@ namespace era_engine::physics
383420 modelOnlyScale,
384421 model,
385422 8 .0f * scale);
423+ finishBody (r_arm, mass* ARM_MASS_PERCENTAGE, 1 .0f );
424+
425+ PxRigidDynamic* l_forearm = createCapsuleBone (
426+ j_lowerarm_l_idx,
427+ j_hand_l_idx,
428+ *ragdoll,
429+ material,
430+ skeleton,
431+ modelWithoutScale,
432+ modelOnlyScale,
433+ model,
434+ 7 .0f * scale);
435+ finishBody (l_forearm, mass* ARM_MASS_PERCENTAGE, 1 .0f );
386436
387- // PxRigidDynamic* l_forearm = createCapsuleBone(
388- // j_lowerarm_l_idx,
389- // j_hand_l_idx,
390- // *ragdoll,
391- // material,
392- // skeleton,
393- // modelWithoutScale,
394- // modelOnlyScale,
395- // model,
396- // 7.0f * scale);
397-
398- // PxRigidDynamic* r_forearm = createCapsuleBone(
399- // j_lowerarm_r_idx,
400- // j_hand_r_idx,
401- // *ragdoll,
402- // material,
403- // skeleton,
404- // modelWithoutScale,
405- // modelOnlyScale,
406- // model,
407- // 7.0f * scale);
437+ PxRigidDynamic* r_forearm = createCapsuleBone (
438+ j_lowerarm_r_idx,
439+ j_hand_r_idx,
440+ *ragdoll,
441+ material,
442+ skeleton,
443+ modelWithoutScale,
444+ modelOnlyScale,
445+ model,
446+ 7 .0f * scale);
447+ finishBody (r_forearm, mass* ARM_MASS_PERCENTAGE, 1 .0f );
408448
409449 /* PxRigidDynamic* l_hand = createSphereBone(
410450 j_middle_01_l_idx,
@@ -479,8 +519,6 @@ namespace era_engine::physics
479519 ragdoll->childToParentJointDeltaPoses [i] = bodyGlobalTransform.position / scale - jointTrs.position ;
480520
481521 ragdoll->childToParentJointDeltaRots [i] = normalize (conjugate (jointTrs.rotation ) * bodyGlobalTransform.rotation );
482-
483- finishBody (body, 1 .0f , 1 .0f );
484522 }
485523
486524 // // ---------------------------------------------------------------------------------------------------------------
@@ -490,41 +528,52 @@ namespace era_engine::physics
490528 // Chest and Head
491529 scene->addActor (*pelvis);
492530 scene->addActor (*head);
531+ scene->addActor (*upperSpine);
493532
494533 // Left Leg
495534 scene->addActor (*l_leg);
496- // scene->addActor(*l_calf);
535+ scene->addActor (*l_calf);
497536 // scene->addActor(*l_foot);
498537
499538 // Right Leg
500539 scene->addActor (*r_leg);
501- // scene->addActor(*r_calf);
540+ scene->addActor (*r_calf);
502541 // scene->addActor(*r_foot);
503542
504543 // Left Arm
505544 scene->addActor (*l_arm);
506- // scene->addActor(*l_forearm);
545+ scene->addActor (*l_forearm);
507546 // scene->addActor(*l_hand);
508547
509548 // Right Arm
510549 scene->addActor (*r_arm);
511- // scene->addActor(*r_forearm);
550+ scene->addActor (*r_forearm);
512551 // scene->addActor(*r_hand);
513552
514553 // // ---------------------------------------------------------------------------------------------------------------
515554 // // Create joints
516555 // // ---------------------------------------------------------------------------------------------------------------
517556
518557 // Chest and Head
519- createD6Joint (pelvis, head, skeleton, j_neck_01_idx, model);
558+ auto * jointHeadpelvis = createD6Joint (upperSpine, head, skeleton, j_neck_01_idx, model);
559+ configD6Joint (3 .14f / 8 .0f , 3 .14f / 8 .0f , -3 .14f / 8 .0f , 3 .14f / 8 .0f , jointHeadpelvis);
560+
561+ auto * jointUpelvis = createD6Joint (upperSpine, pelvis, skeleton, j_spine_03_idx, model);
562+ configD6Joint (3 .14f / 12 .0f , 3 .14f / 12 .0f , -3 .14f / 12 .0f , 3 .14f / 12 .0f , jointUpelvis);
520563
521564 // Chest to Thighs
522- createD6Joint (pelvis, l_leg, skeleton, j_thigh_l_idx, model);
523- createD6Joint (pelvis, r_leg, skeleton, j_thigh_r_idx, model);
565+ auto * jointLLegpelvis = createD6Joint (pelvis, l_leg, skeleton, j_thigh_l_idx, model);
566+ configD6Joint (3 .14f / 6 .0f , 3 .14f / 6 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointLLegpelvis);
567+
568+ auto * jointRLegpelvis = createD6Joint (pelvis, r_leg, skeleton, j_thigh_r_idx, model);
569+ configD6Joint (3 .14f / 6 .0f , 3 .14f / 6 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointRLegpelvis);
524570
525571 // Thighs to Calf
526- // createD6Joint(l_leg, l_calf, skeleton, j_calf_l_idx, model);
527- // createD6Joint(r_leg, r_calf, skeleton, j_calf_r_idx, model);
572+ auto * jointLLegCalf = createD6Joint (l_leg, l_calf, skeleton, j_calf_l_idx, model);
573+ configD6Joint (3 .14f / 6 .0f , 3 .14f / 6 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointLLegCalf);
574+
575+ auto * jointRLegCalf = createD6Joint (r_leg, r_calf, skeleton, j_calf_r_idx, model);
576+ configD6Joint (3 .14f / 6 .0f , 3 .14f / 6 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointRLegCalf);
528577 // //createRevoluteJoint(l_leg, l_calf, skeleton, j_calf_l_idx, mat4::identity, model);
529578 // //createRevoluteJoint(r_leg, r_calf, skeleton, j_calf_r_idx, mat4::identity, model);
530579
@@ -533,19 +582,24 @@ namespace era_engine::physics
533582 // //createD6Joint(r_calf, r_foot, skeleton, j_foot_r_idx, model);
534583
535584 // Chest to Upperarm
536- createD6Joint (pelvis, l_arm, skeleton, j_upperarm_l_idx, model);
537- createD6Joint (pelvis, r_arm, skeleton, j_upperarm_r_idx, model);
585+ auto * jointLArmPelvis = createD6Joint (upperSpine, l_arm, skeleton, j_upperarm_l_idx, model);
586+ configD6Joint (3 .14f / 4 .0f , 3 .14f / 4 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointLArmPelvis);
587+ auto * jointRArmPelvis = createD6Joint (upperSpine, r_arm, skeleton, j_upperarm_r_idx, model);
588+ configD6Joint (3 .14f / 4 .0f , 3 .14f / 4 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointRArmPelvis);
538589
539590 // //mat4 arm_rot = mat4::identity;
540591 // //arm_rot = trsToMat4(trs{vec3(0.0f), quat(vec3(0.0f, 0.0f, 1.0f), -PxPi / 2.0f) });
541592
542593 // Upperarm to Lowerman
543594 // //createRevoluteJoint(l_arm, l_forearm, skeleton, j_lowerarm_l_idx, arm_rot, model);
544- // createD6Joint(l_arm, l_forearm, skeleton, j_lowerarm_l_idx, model);
595+ auto * jointLArmForearm = createD6Joint (l_arm, l_forearm, skeleton, j_lowerarm_l_idx, model);
596+ configD6Joint (3 .14f / 4 .0f , 3 .14f / 4 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointLArmForearm);
545597
546598 // //arm_rot = mat4::identity;
547599 // //arm_rot = trsToMat4(trs{ vec3(0.0f), quat(vec3(0.0f, 0.0f, 1.0f), PxPi / 2.0f) });
548- // createD6Joint(r_arm, r_forearm, skeleton, j_lowerarm_r_idx, model);
600+ auto * jointRArmForearm = createD6Joint (r_arm, r_forearm, skeleton, j_lowerarm_r_idx, model);
601+ configD6Joint (3 .14f / 4 .0f , 3 .14f / 4 .0f , -3 .14f / 6 .0f , 3 .14f / 6 .0f , jointRArmForearm);
602+
549603
550604 // //createRevoluteJoint(r_arm, r_forearm, skeleton, j_lowerarm_r_idx, arm_rot, model);
551605
@@ -605,8 +659,12 @@ namespace era_engine::physics
605659 quat deltaRotation = bodyGlobalTransform.rotation * conjugate (ragdoll->originalBodyRotations [i]);
606660 mat4 translationRot;
607661
608- if (chosenIdx == i)
609- translationRot = trsToMat4 (trs{ bodyGlobalTransform.position / scale - ragdoll->childToParentJointDeltaPoses [i], jointTrs.rotation * conjugate (deltaRotation) });
662+ if (chosenIdx == i)
663+ {
664+ vec3 pos = jointTrs.position + (bodyGlobalTransform.position / scale - ragdoll->initialBodyPos [i] / scale);
665+
666+ translationRot = trsToMat4 (trs{ pos, deltaRotation * jointTrs.rotation });
667+ }
610668 else
611669 {
612670 auto & parent = joints[chosenIdx];
0 commit comments