@@ -45,6 +45,7 @@ namespace era_engine::physics
45
45
mat4 model = mat4::identity,
46
46
float r = 0 .5f ,
47
47
mat4 rotation = mat4::identity,
48
+ float hm = 1 .0f ,
48
49
float mass = 1 .0f )
49
50
{
50
51
const auto & physics = physics_holder::physicsRef;
@@ -54,15 +55,15 @@ namespace era_engine::physics
54
55
vec3 parentPos = bindPosWs (joints[parentIdx].bindTransform , model);
55
56
vec3 childPos = bindPosWs (joints[childIdx].bindTransform , model);
56
57
57
- float len = length (parentPos - childPos);
58
+ vec3 offset = parentPos - childPos;
59
+ float len = length (offset);
58
60
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 ;
61
65
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 ;
66
67
67
68
vec3 bodyPos = (parentPos + childPos) / 2 .0f ;
68
69
@@ -104,6 +105,7 @@ namespace era_engine::physics
104
105
mat4 model = mat4::identity,
105
106
float r = 0 .5f ,
106
107
mat4 rotation = mat4::identity,
108
+ float hm = 1 .0f ,
107
109
float mass = 1 .0f )
108
110
{
109
111
const auto & physics = physics_holder::physicsRef;
@@ -112,7 +114,7 @@ namespace era_engine::physics
112
114
113
115
vec3 parentPos = (bindPosWs (joints[parentIdx].bindTransform , model) + offset);
114
116
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);
116
118
117
119
PxTransform local (createPxQuat (mat4ToTRS (rotation).rotation ));
118
120
shape->setLocalPose (local);
@@ -168,7 +170,7 @@ namespace era_engine::physics
168
170
return body;
169
171
}
170
172
171
- static void createD6Joint (
173
+ static PxD6Joint* createD6Joint (
172
174
PxRigidDynamic* parent,
173
175
PxRigidDynamic* child,
174
176
ref<animation::animation_skeleton> skeleton,
@@ -189,7 +191,7 @@ namespace era_engine::physics
189
191
190
192
joint->setConstraintFlag (PxConstraintFlag::eVISUALIZATION, true );
191
193
192
- configD6Joint ( 3 . 14f / 4 . f , 3 . 14f / 4 . f , - 3 . 14f / 8 . f , 3 . 14f / 8 . f , joint) ;
194
+ return joint;
193
195
}
194
196
195
197
static void createRevoluteJoint (
@@ -231,6 +233,16 @@ namespace era_engine::physics
231
233
{
232
234
}
233
235
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
+
234
246
void px_ragdoll_component::initRagdoll (ref<animation::animation_skeleton> skeletonRef)
235
247
{
236
248
using namespace animation ;
@@ -272,6 +284,8 @@ namespace era_engine::physics
272
284
uint32_t j_hand_r_idx = skeleton->nameToJointID [" hand_r" ];
273
285
uint32_t j_middle_01_r_idx = skeleton->nameToJointID [" middle_01_r" ];
274
286
287
+ float mass = 100 .0f ;
288
+
275
289
transforms.resize (joints.size ());
276
290
277
291
ragdoll->initialBodyPos .resize (joints.size ());
@@ -291,15 +305,31 @@ namespace era_engine::physics
291
305
292
306
PxRigidDynamic* pelvis = createCapsuleBone (
293
307
j_pelvis_idx,
294
- j_neck_01_idx ,
308
+ j_spine_03_idx ,
295
309
*ragdoll,
296
310
material,
297
311
skeleton,
298
312
modelWithoutScale,
299
313
modelOnlyScale,
300
314
model,
301
315
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 );
303
333
304
334
PxRigidDynamic* head = createCapsuleBone (
305
335
j_head_idx,
@@ -313,6 +343,7 @@ namespace era_engine::physics
313
343
model,
314
344
6 .0f * scale,
315
345
rot);
346
+ finishBody (head, mass * HEAD_MASS_PERCENTAGE, 1 .0f );
316
347
317
348
PxRigidDynamic* l_leg = createCapsuleBone (
318
349
j_thigh_l_idx,
@@ -325,6 +356,7 @@ namespace era_engine::physics
325
356
model,
326
357
8 .0f * scale,
327
358
rot);
359
+ finishBody (l_leg, mass * LEG_MASS_PERCENTAGE, 1 .0f );
328
360
329
361
PxRigidDynamic* r_leg = createCapsuleBone (
330
362
j_thigh_r_idx,
@@ -337,30 +369,33 @@ namespace era_engine::physics
337
369
model,
338
370
8 .0f * scale,
339
371
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 );
340
386
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 );
364
399
365
400
PxRigidDynamic* l_arm = createCapsuleBone (
366
401
j_upperarm_l_idx,
@@ -372,6 +407,8 @@ namespace era_engine::physics
372
407
modelOnlyScale,
373
408
model,
374
409
8 .0f * scale);
410
+ finishBody (l_arm, mass * ARM_MASS_PERCENTAGE, 1 .0f );
411
+
375
412
376
413
PxRigidDynamic* r_arm = createCapsuleBone (
377
414
j_upperarm_r_idx,
@@ -383,28 +420,31 @@ namespace era_engine::physics
383
420
modelOnlyScale,
384
421
model,
385
422
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 );
386
436
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 );
408
448
409
449
/* PxRigidDynamic* l_hand = createSphereBone(
410
450
j_middle_01_l_idx,
@@ -479,8 +519,6 @@ namespace era_engine::physics
479
519
ragdoll->childToParentJointDeltaPoses [i] = bodyGlobalTransform.position / scale - jointTrs.position ;
480
520
481
521
ragdoll->childToParentJointDeltaRots [i] = normalize (conjugate (jointTrs.rotation ) * bodyGlobalTransform.rotation );
482
-
483
- finishBody (body, 1 .0f , 1 .0f );
484
522
}
485
523
486
524
// // ---------------------------------------------------------------------------------------------------------------
@@ -490,41 +528,52 @@ namespace era_engine::physics
490
528
// Chest and Head
491
529
scene->addActor (*pelvis);
492
530
scene->addActor (*head);
531
+ scene->addActor (*upperSpine);
493
532
494
533
// Left Leg
495
534
scene->addActor (*l_leg);
496
- // scene->addActor(*l_calf);
535
+ scene->addActor (*l_calf);
497
536
// scene->addActor(*l_foot);
498
537
499
538
// Right Leg
500
539
scene->addActor (*r_leg);
501
- // scene->addActor(*r_calf);
540
+ scene->addActor (*r_calf);
502
541
// scene->addActor(*r_foot);
503
542
504
543
// Left Arm
505
544
scene->addActor (*l_arm);
506
- // scene->addActor(*l_forearm);
545
+ scene->addActor (*l_forearm);
507
546
// scene->addActor(*l_hand);
508
547
509
548
// Right Arm
510
549
scene->addActor (*r_arm);
511
- // scene->addActor(*r_forearm);
550
+ scene->addActor (*r_forearm);
512
551
// scene->addActor(*r_hand);
513
552
514
553
// // ---------------------------------------------------------------------------------------------------------------
515
554
// // Create joints
516
555
// // ---------------------------------------------------------------------------------------------------------------
517
556
518
557
// 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);
520
563
521
564
// 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);
524
570
525
571
// 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);
528
577
// //createRevoluteJoint(l_leg, l_calf, skeleton, j_calf_l_idx, mat4::identity, model);
529
578
// //createRevoluteJoint(r_leg, r_calf, skeleton, j_calf_r_idx, mat4::identity, model);
530
579
@@ -533,19 +582,24 @@ namespace era_engine::physics
533
582
// //createD6Joint(r_calf, r_foot, skeleton, j_foot_r_idx, model);
534
583
535
584
// 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);
538
589
539
590
// //mat4 arm_rot = mat4::identity;
540
591
// //arm_rot = trsToMat4(trs{vec3(0.0f), quat(vec3(0.0f, 0.0f, 1.0f), -PxPi / 2.0f) });
541
592
542
593
// Upperarm to Lowerman
543
594
// //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);
545
597
546
598
// //arm_rot = mat4::identity;
547
599
// //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
+
549
603
550
604
// //createRevoluteJoint(r_arm, r_forearm, skeleton, j_lowerarm_r_idx, arm_rot, model);
551
605
@@ -605,8 +659,12 @@ namespace era_engine::physics
605
659
quat deltaRotation = bodyGlobalTransform.rotation * conjugate (ragdoll->originalBodyRotations [i]);
606
660
mat4 translationRot;
607
661
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
+ }
610
668
else
611
669
{
612
670
auto & parent = joints[chosenIdx];
0 commit comments