@@ -60,7 +60,7 @@ namespace era_engine::physics
60
60
len -= len * 0 .1f ;
61
61
62
62
if (len - 2 .0f * r > 0 )
63
- len = len - 2 . 0f * r;
63
+ len = len - r;
64
64
65
65
float halfHeight = len / 2 .0f ;
66
66
@@ -274,6 +274,7 @@ namespace era_engine::physics
274
274
275
275
transforms.resize (joints.size ());
276
276
277
+ ragdoll->initialBodyPos .resize (joints.size ());
277
278
ragdoll->rigidBodies .resize (joints.size ());
278
279
ragdoll->childToParentJointDeltaPoses .resize (joints.size ());
279
280
ragdoll->childToParentJointDeltaRots .resize (joints.size ());
@@ -322,7 +323,7 @@ namespace era_engine::physics
322
323
modelWithoutScale,
323
324
modelOnlyScale,
324
325
model,
325
- r ,
326
+ 8 . 0f * scale ,
326
327
rot);
327
328
328
329
PxRigidDynamic* r_leg = createCapsuleBone (
@@ -334,32 +335,32 @@ namespace era_engine::physics
334
335
modelWithoutScale,
335
336
modelOnlyScale,
336
337
model,
337
- r ,
338
+ 8 . 0f * scale ,
338
339
rot);
339
340
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);
363
364
364
365
PxRigidDynamic* l_arm = createCapsuleBone (
365
366
j_upperarm_l_idx,
@@ -370,7 +371,7 @@ namespace era_engine::physics
370
371
modelWithoutScale,
371
372
modelOnlyScale,
372
373
model,
373
- r );
374
+ 8 . 0f * scale );
374
375
375
376
PxRigidDynamic* r_arm = createCapsuleBone (
376
377
j_upperarm_r_idx,
@@ -381,31 +382,31 @@ namespace era_engine::physics
381
382
modelWithoutScale,
382
383
modelOnlyScale,
383
384
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(
409
410
j_middle_01_l_idx,
410
411
*ragdoll,
411
412
material,
@@ -421,11 +422,11 @@ namespace era_engine::physics
421
422
r,
422
423
skeleton,
423
424
model,
424
- 1 .0f );
425
+ 1.0f);*/
425
426
426
427
rot = mat4::identity;
427
428
428
- PxRigidDynamic* l_foot = createCapsuleBone (
429
+ /* PxRigidDynamic* l_foot = createCapsuleBone(
429
430
j_foot_l_idx,
430
431
j_ball_l_idx,
431
432
*ragdoll,
@@ -447,7 +448,7 @@ namespace era_engine::physics
447
448
modelOnlyScale,
448
449
model,
449
450
r,
450
- rot);
451
+ rot);*/
451
452
452
453
for (int i = 1 ; i < skeleton->joints .size (); i++)
453
454
{
@@ -464,6 +465,7 @@ namespace era_engine::physics
464
465
465
466
trs jointTrs = mat4ToTRS (skeleton->joints [i].bindTransform );
466
467
468
+ ragdoll->initialBodyPos [i] = bodyGlobalTransform.position ;
467
469
ragdoll->relativeJointPoses [i] = (invBodyPosTransformMat * vec4 (jointTrs.position , 1 .0f )).xyz ;
468
470
ragdoll->originalBodyRotations [i] = normalize (bodyGlobalTransform.rotation );
469
471
@@ -476,7 +478,7 @@ namespace era_engine::physics
476
478
477
479
ragdoll->childToParentJointDeltaPoses [i] = bodyGlobalTransform.position / scale - jointTrs.position ;
478
480
479
- ragdoll->childToParentJointDeltaRots [i] = normalize (bodyGlobalTransform .rotation * conjugate (jointTrs .rotation ) );
481
+ ragdoll->childToParentJointDeltaRots [i] = normalize (conjugate (jointTrs .rotation ) * bodyGlobalTransform .rotation );
480
482
481
483
finishBody (body, 1 .0f , 1 .0f );
482
484
}
@@ -491,23 +493,23 @@ namespace era_engine::physics
491
493
492
494
// Left Leg
493
495
scene->addActor (*l_leg);
494
- scene->addActor (*l_calf);
495
- scene->addActor (*l_foot);
496
+ // scene->addActor(*l_calf);
497
+ // scene->addActor(*l_foot);
496
498
497
499
// Right Leg
498
500
scene->addActor (*r_leg);
499
- scene->addActor (*r_calf);
500
- scene->addActor (*r_foot);
501
+ // scene->addActor(*r_calf);
502
+ // scene->addActor(*r_foot);
501
503
502
504
// Left Arm
503
505
scene->addActor (*l_arm);
504
- scene->addActor (*l_forearm);
505
- scene->addActor (*l_hand);
506
+ // scene->addActor(*l_forearm);
507
+ // scene->addActor(*l_hand);
506
508
507
509
// Right Arm
508
510
scene->addActor (*r_arm);
509
- scene->addActor (*r_forearm);
510
- scene->addActor (*r_hand);
511
+ // scene->addActor(*r_forearm);
512
+ // scene->addActor(*r_hand);
511
513
512
514
// // ---------------------------------------------------------------------------------------------------------------
513
515
// // Create joints
@@ -521,35 +523,35 @@ namespace era_engine::physics
521
523
createD6Joint (pelvis, r_leg, skeleton, j_thigh_r_idx, model);
522
524
523
525
// 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);
528
530
529
531
// 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);
532
534
533
535
// Chest to Upperarm
534
536
createD6Joint (pelvis, l_arm, skeleton, j_upperarm_l_idx, model);
535
537
createD6Joint (pelvis, r_arm, skeleton, j_upperarm_r_idx, model);
536
538
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) });
539
541
540
542
// 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);
543
545
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);
547
549
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);
549
551
550
552
// 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);
553
555
554
556
ragdoll->setKinematic (false );
555
557
@@ -587,7 +589,6 @@ namespace era_engine::physics
587
589
588
590
if (ragdoll->rigidBodies .size () > 0 )
589
591
{
590
-
591
592
std::vector<skeleton_joint>& joints = skeleton->joints ;
592
593
593
594
transforms[0 ] = mat4ToTRS (joints[0 ].bindTransform );
@@ -599,17 +600,28 @@ namespace era_engine::physics
599
600
600
601
PxTransform pxPose = body->getGlobalPose ();
601
602
trs bodyGlobalTransform = trs{ createVec3 (pxPose.p ), createQuat (pxPose.q ) };
603
+ trs jointTrs = mat4ToTRS (skeleton->joints [i].bindTransform );
602
604
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 );
604
614
605
- trs jointTrs = mat4ToTRS (skeleton->joints [i].bindTransform );
615
+ vec3 localPos = jointTrs.position - parentPos.position ;
616
+
617
+ localPos = deltaRotation * localPos;
606
618
607
- quat deltaRotation = normalize ( conjugate ( ragdoll->originalBodyRotations [i]) * bodyGlobalTransform. rotation );
619
+ vec3 pos = localPos + parentPos. position + (bodyGlobalTransform. position / scale - ragdoll->initialBodyPos [i] / scale );
608
620
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
+ }
611
623
612
- transforms[i] = mat4ToTRS (modelWithoutScale * translation * rotation );
624
+ transforms[i] = mat4ToTRS (invert ( modelWithoutScale) * translationRot );
613
625
}
614
626
}
615
627
0 commit comments