Skip to content

Commit 34e9afb

Browse files
committed
[ERA-1] ragdoll skinning p3
1 parent 11142a7 commit 34e9afb

File tree

2 files changed

+132
-74
lines changed

2 files changed

+132
-74
lines changed

modules/core/src/animation/animation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,6 @@ namespace era_engine::animation
268268
trs* currentGlobalTransforms = 0;
269269

270270
float timeScale = 1.f;
271-
bool drawSceleton = true;
271+
bool drawSceleton = false;
272272
};
273273
}

modules/core/src/px/features/px_ragdoll.cpp

Lines changed: 131 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)