Skip to content

Commit 11142a7

Browse files
committed
[ERA-1] ragdoll skinning p3
1 parent 50efbea commit 11142a7

File tree

3 files changed

+102
-88
lines changed

3 files changed

+102
-88
lines changed

modules/core/src/animation/animation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ namespace era_engine::animation
780780
}
781781

782782
currentGlobalTransforms = globalTransforms;
783-
783+
// TODO
784784
ragdoll->updateKinematic();
785785

786786
if (animation->finished)

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

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

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ namespace era_engine::physics
2626
std::vector<vec3> bodyPosRelativeToJoint;
2727
std::vector<quat> originalJointRotations;
2828

29+
std::vector<vec3> initialBodyPos;
30+
2931
bool kinematic = false;
3032

3133
PxRigidDynamic* findRecentBody(uint32_t idx, ref<animation::animation_skeleton> skeleton, uint32_t& chosenIdx);

0 commit comments

Comments
 (0)