@@ -60,7 +60,7 @@ namespace era_engine::physics
6060 len -= len * 0 .1f ;
6161
6262 if (len - 2 .0f * r > 0 )
63- len = len - 2 . 0f * r;
63+ len = len - r;
6464
6565 float halfHeight = len / 2 .0f ;
6666
@@ -274,6 +274,7 @@ namespace era_engine::physics
274274
275275 transforms.resize (joints.size ());
276276
277+ ragdoll->initialBodyPos .resize (joints.size ());
277278 ragdoll->rigidBodies .resize (joints.size ());
278279 ragdoll->childToParentJointDeltaPoses .resize (joints.size ());
279280 ragdoll->childToParentJointDeltaRots .resize (joints.size ());
@@ -322,7 +323,7 @@ namespace era_engine::physics
322323 modelWithoutScale,
323324 modelOnlyScale,
324325 model,
325- r ,
326+ 8 . 0f * scale ,
326327 rot);
327328
328329 PxRigidDynamic* r_leg = createCapsuleBone (
@@ -334,32 +335,32 @@ namespace era_engine::physics
334335 modelWithoutScale,
335336 modelOnlyScale,
336337 model,
337- r ,
338+ 8 . 0f * scale ,
338339 rot);
339340
340- PxRigidDynamic* l_calf = createCapsuleBone (
341- j_calf_l_idx,
342- j_foot_l_idx,
343- *ragdoll,
344- material,
345- skeleton,
346- modelWithoutScale,
347- modelOnlyScale,
348- model,
349- r ,
350- rot);
351-
352- PxRigidDynamic* r_calf = createCapsuleBone (
353- j_calf_r_idx,
354- j_foot_r_idx,
355- *ragdoll,
356- material,
357- skeleton,
358- modelWithoutScale,
359- modelOnlyScale,
360- model,
361- r ,
362- rot);
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);
363364
364365 PxRigidDynamic* l_arm = createCapsuleBone (
365366 j_upperarm_l_idx,
@@ -370,7 +371,7 @@ namespace era_engine::physics
370371 modelWithoutScale,
371372 modelOnlyScale,
372373 model,
373- r );
374+ 8 . 0f * scale );
374375
375376 PxRigidDynamic* r_arm = createCapsuleBone (
376377 j_upperarm_r_idx,
@@ -381,31 +382,31 @@ namespace era_engine::physics
381382 modelWithoutScale,
382383 modelOnlyScale,
383384 model,
384- r );
385-
386- PxRigidDynamic* l_forearm = createCapsuleBone (
387- j_lowerarm_l_idx,
388- j_hand_l_idx,
389- *ragdoll,
390- material,
391- skeleton,
392- modelWithoutScale,
393- modelOnlyScale,
394- model,
395- r );
396-
397- PxRigidDynamic* r_forearm = createCapsuleBone (
398- j_lowerarm_r_idx,
399- j_hand_r_idx,
400- *ragdoll,
401- material,
402- skeleton,
403- modelWithoutScale,
404- modelOnlyScale,
405- model,
406- r );
407-
408- PxRigidDynamic* l_hand = createSphereBone (
385+ 8 . 0f * scale );
386+
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 );
408+
409+ /* PxRigidDynamic* l_hand = createSphereBone(
409410 j_middle_01_l_idx,
410411 *ragdoll,
411412 material,
@@ -421,11 +422,11 @@ namespace era_engine::physics
421422 r,
422423 skeleton,
423424 model,
424- 1 .0f );
425+ 1.0f);*/
425426
426427 rot = mat4::identity;
427428
428- PxRigidDynamic* l_foot = createCapsuleBone (
429+ /* PxRigidDynamic* l_foot = createCapsuleBone(
429430 j_foot_l_idx,
430431 j_ball_l_idx,
431432 *ragdoll,
@@ -447,7 +448,7 @@ namespace era_engine::physics
447448 modelOnlyScale,
448449 model,
449450 r,
450- rot);
451+ rot);*/
451452
452453 for (int i = 1 ; i < skeleton->joints .size (); i++)
453454 {
@@ -464,6 +465,7 @@ namespace era_engine::physics
464465
465466 trs jointTrs = mat4ToTRS (skeleton->joints [i].bindTransform );
466467
468+ ragdoll->initialBodyPos [i] = bodyGlobalTransform.position ;
467469 ragdoll->relativeJointPoses [i] = (invBodyPosTransformMat * vec4 (jointTrs.position , 1 .0f )).xyz ;
468470 ragdoll->originalBodyRotations [i] = normalize (bodyGlobalTransform.rotation );
469471
@@ -476,7 +478,7 @@ namespace era_engine::physics
476478
477479 ragdoll->childToParentJointDeltaPoses [i] = bodyGlobalTransform.position / scale - jointTrs.position ;
478480
479- ragdoll->childToParentJointDeltaRots [i] = normalize (bodyGlobalTransform .rotation * conjugate (jointTrs .rotation ) );
481+ ragdoll->childToParentJointDeltaRots [i] = normalize (conjugate (jointTrs .rotation ) * bodyGlobalTransform .rotation );
480482
481483 finishBody (body, 1 .0f , 1 .0f );
482484 }
@@ -491,23 +493,23 @@ namespace era_engine::physics
491493
492494 // Left Leg
493495 scene->addActor (*l_leg);
494- scene->addActor (*l_calf);
495- scene->addActor (*l_foot);
496+ // scene->addActor(*l_calf);
497+ // scene->addActor(*l_foot);
496498
497499 // Right Leg
498500 scene->addActor (*r_leg);
499- scene->addActor (*r_calf);
500- scene->addActor (*r_foot);
501+ // scene->addActor(*r_calf);
502+ // scene->addActor(*r_foot);
501503
502504 // Left Arm
503505 scene->addActor (*l_arm);
504- scene->addActor (*l_forearm);
505- scene->addActor (*l_hand);
506+ // scene->addActor(*l_forearm);
507+ // scene->addActor(*l_hand);
506508
507509 // Right Arm
508510 scene->addActor (*r_arm);
509- scene->addActor (*r_forearm);
510- scene->addActor (*r_hand);
511+ // scene->addActor(*r_forearm);
512+ // scene->addActor(*r_hand);
511513
512514 // // ---------------------------------------------------------------------------------------------------------------
513515 // // Create joints
@@ -521,35 +523,35 @@ namespace era_engine::physics
521523 createD6Joint (pelvis, r_leg, skeleton, j_thigh_r_idx, model);
522524
523525 // Thighs to Calf
524- createD6Joint (l_leg, l_calf, skeleton, j_calf_l_idx, model);
525- createD6Joint (r_leg, r_calf, skeleton, j_calf_r_idx, model);
526- // createRevoluteJoint(l_leg, l_calf, skeleton, j_calf_l_idx, mat4::identity, model);
527- // createRevoluteJoint(r_leg, r_calf, skeleton, j_calf_r_idx, mat4::identity, model);
526+ // createD6Joint(l_leg, l_calf, skeleton, j_calf_l_idx, model);
527+ // createD6Joint(r_leg, r_calf, skeleton, j_calf_r_idx, model);
528+ // // createRevoluteJoint(l_leg, l_calf, skeleton, j_calf_l_idx, mat4::identity, model);
529+ // // createRevoluteJoint(r_leg, r_calf, skeleton, j_calf_r_idx, mat4::identity, model);
528530
529531 // Calf to Foot
530- createD6Joint (l_calf, l_foot, skeleton, j_foot_l_idx, model);
531- createD6Joint (r_calf, r_foot, skeleton, j_foot_r_idx, model);
532+ // // createD6Joint(l_calf, l_foot, skeleton, j_foot_l_idx, model);
533+ // // createD6Joint(r_calf, r_foot, skeleton, j_foot_r_idx, model);
532534
533535 // Chest to Upperarm
534536 createD6Joint (pelvis, l_arm, skeleton, j_upperarm_l_idx, model);
535537 createD6Joint (pelvis, r_arm, skeleton, j_upperarm_r_idx, model);
536538
537- // mat4 arm_rot = mat4::identity;
538- // arm_rot = trsToMat4(trs{vec3(0.0f), quat(vec3(0.0f, 0.0f, 1.0f), -PxPi / 2.0f) });
539+ // // mat4 arm_rot = mat4::identity;
540+ // // arm_rot = trsToMat4(trs{vec3(0.0f), quat(vec3(0.0f, 0.0f, 1.0f), -PxPi / 2.0f) });
539541
540542 // Upperarm to Lowerman
541- // createRevoluteJoint(l_arm, l_forearm, skeleton, j_lowerarm_l_idx, arm_rot, model);
542- createD6Joint (l_arm, l_forearm, skeleton, j_lowerarm_l_idx, model);
543+ // // 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);
543545
544- // arm_rot = mat4::identity;
545- // arm_rot = trsToMat4(trs{ vec3(0.0f), quat(vec3(0.0f, 0.0f, 1.0f), PxPi / 2.0f) });
546- createD6Joint (r_arm, r_forearm, skeleton, j_lowerarm_r_idx, model);
546+ // // arm_rot = mat4::identity;
547+ // // 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);
547549
548- // createRevoluteJoint(r_arm, r_forearm, skeleton, j_lowerarm_r_idx, arm_rot, model);
550+ // // createRevoluteJoint(r_arm, r_forearm, skeleton, j_lowerarm_r_idx, arm_rot, model);
549551
550552 // Lowerman to Hand
551- createD6Joint (l_forearm, l_hand, skeleton, j_hand_l_idx, model);
552- createD6Joint (r_forearm, r_hand, skeleton, j_hand_r_idx, model);
553+ // createD6Joint(l_forearm, l_hand, skeleton, j_hand_l_idx, model);
554+ // createD6Joint(r_forearm, r_hand, skeleton, j_hand_r_idx, model);
553555
554556 ragdoll->setKinematic (false );
555557
@@ -587,7 +589,6 @@ namespace era_engine::physics
587589
588590 if (ragdoll->rigidBodies .size () > 0 )
589591 {
590-
591592 std::vector<skeleton_joint>& joints = skeleton->joints ;
592593
593594 transforms[0 ] = mat4ToTRS (joints[0 ].bindTransform );
@@ -599,17 +600,28 @@ namespace era_engine::physics
599600
600601 PxTransform pxPose = body->getGlobalPose ();
601602 trs bodyGlobalTransform = trs{ createVec3 (pxPose.p ), createQuat (pxPose.q ) };
603+ trs jointTrs = mat4ToTRS (skeleton->joints [i].bindTransform );
602604
603- vec4 globalJointPos = trsToMat4 (bodyGlobalTransform) * vec4 (ragdoll->relativeJointPoses [i], 1 .0f );
605+ quat deltaRotation = bodyGlobalTransform.rotation * conjugate (ragdoll->originalBodyRotations [i]);
606+ mat4 translationRot;
607+
608+ if (chosenIdx == i)
609+ translationRot = trsToMat4 (trs{ bodyGlobalTransform.position / scale - ragdoll->childToParentJointDeltaPoses [i], jointTrs.rotation * conjugate (deltaRotation) });
610+ else
611+ {
612+ auto & parent = joints[chosenIdx];
613+ trs parentPos = mat4ToTRS (parent.bindTransform );
604614
605- trs jointTrs = mat4ToTRS (skeleton->joints [i].bindTransform );
615+ vec3 localPos = jointTrs.position - parentPos.position ;
616+
617+ localPos = deltaRotation * localPos;
606618
607- quat deltaRotation = normalize ( conjugate ( ragdoll->originalBodyRotations [i]) * bodyGlobalTransform. rotation );
619+ vec3 pos = localPos + parentPos. position + (bodyGlobalTransform. position / scale - ragdoll->initialBodyPos [i] / scale );
608620
609- mat4 translation = trsToMat4 (trs{ bodyGlobalTransform. position / scale - ragdoll-> childToParentJointDeltaPoses [i], quat::identity });
610- mat4 rotation = modelRotation * trsToMat4 (trs{ vec3 ( 0 . 0f ), jointTrs. rotation * deltaRotation });
621+ translationRot = trsToMat4 (trs{ pos, deltaRotation * jointTrs. rotation });
622+ }
611623
612- transforms[i] = mat4ToTRS (modelWithoutScale * translation * rotation );
624+ transforms[i] = mat4ToTRS (invert ( modelWithoutScale) * translationRot );
613625 }
614626 }
615627
0 commit comments