Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/hooking/skeleton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,16 +134,16 @@ class Skeleton {
dist = glm::clamp(dist, epsilon, l1 + l2 - epsilon);

// law of cosines for angle at shoulder (alpha)
float cosAlpha = (l1 * l1 + dist * dist - l2 * l2) / (2 * l1 * dist);
float alpha = glm::acos(glm::clamp(cosAlpha, -1.0f, 1.0f));
float cosAlpha = std::clamp((l1 * l1 + dist * dist - l2 * l2) / (2 * l1 * dist), -1.0f, 1.0f);
float sinAlpha = -std::sqrt(1.0 - cosAlpha * cosAlpha);

// plane construction
glm::vec3 dirNorm = glm::normalize(dir);
glm::vec3 planeNormal = glm::normalize(glm::cross(dirNorm, poleVector));
glm::vec3 ortho = glm::normalize(glm::cross(planeNormal, dirNorm));

// arm 1 direction (world)
glm::vec3 arm1Dir = glm::normalize(dirNorm * cos(alpha) + ortho * sin(alpha));
glm::vec3 arm1Dir = glm::normalize(dirNorm * cosAlpha + ortho * sinAlpha);

// arm 2 direction (world)
glm::vec3 elbowPos = rootPos + arm1Dir * l1;
Expand All @@ -153,12 +153,12 @@ class Skeleton {
glm::vec3 x1 = arm1Dir * boneForwardSign;
glm::vec3 z1 = planeNormal;
glm::vec3 y1 = glm::cross(z1, x1);
glm::mat3 rot1World = glm::mat3(x1, -y1, -z1);
glm::mat3 rot1World = glm::mat3(x1, y1, z1);

glm::vec3 x2 = arm2Dir * boneForwardSign;
glm::vec3 z2 = planeNormal;
glm::vec3 y2 = glm::cross(z2, x2);
glm::mat3 rot2World = glm::mat3(x2, -y2, -z2);
glm::mat3 rot2World = glm::mat3(x2, y2, z2);

// convert to local space
glm::mat4 arm1Local = glm::inverse(parentWorld) * glm::mat4(rot1World);
Expand Down Expand Up @@ -464,8 +464,8 @@ void CemuHooks::hook_ModifyBoneMatrix(PPCInterpreter_t* hCPU) {
glm::vec3 targetPos = glm::vec3(targetModel[3]);

// pole vector (elbow direction)
// left: left-down-back, right: right-down-back
glm::vec3 poleDir = isLeft ? glm::vec3(1.0f, -1.0f, -0.5f) : glm::vec3(-1.0f, -1.0f, -0.5f);
// left: right-up-front, right: left-up-front
glm::vec3 poleDir = isLeft ? glm::vec3(-1.0f, 1.0f, 0.5f) : glm::vec3(1.0f, 1.0f, 0.5f);

// rotate pole vector by body rotation (Skl_Root)
if (Bone* rootBone = s_skeleton.GetBone("Skl_Root")) {
Expand Down