mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2025-04-24 13:29:01 +08:00
chore: unify FixAPose functions into SetupOutfit.FixAPose
This commit is contained in:
parent
eed6d52c9a
commit
73ff7bf6d1
@ -194,7 +194,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
if (posReset_convertATPose)
|
if (posReset_convertATPose)
|
||||||
{
|
{
|
||||||
FixAPose(mama.transform);
|
SetupOutfit.FixAPose(RuntimeUtil.FindAvatarTransformInParents(mergeTarget.transform).gameObject, mama.transform, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (posReset_heuristicRootScale && !suppressRootScale)
|
if (posReset_heuristicRootScale && !suppressRootScale)
|
||||||
@ -211,60 +211,6 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
mama.ResetArmatureLock();
|
mama.ResetArmatureLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FixAPose(Transform outfitArmature)
|
|
||||||
{
|
|
||||||
if (mergeTarget == null) return;
|
|
||||||
if (rootAnimator == null) return;
|
|
||||||
|
|
||||||
FixSingleArm(HumanBodyBones.LeftShoulder);
|
|
||||||
FixSingleArm(HumanBodyBones.RightShoulder);
|
|
||||||
FixSingleArm(HumanBodyBones.LeftUpperArm);
|
|
||||||
FixSingleArm(HumanBodyBones.RightUpperArm);
|
|
||||||
|
|
||||||
void FixSingleArm(HumanBodyBones arm)
|
|
||||||
{
|
|
||||||
var lowerArm = (HumanBodyBones)((int)arm + 2);
|
|
||||||
|
|
||||||
// check if the rotation of the arm differs
|
|
||||||
var avatarArm = rootAnimator.GetBoneTransform(arm);
|
|
||||||
var outfitArm = avatarToOutfit(avatarArm);
|
|
||||||
|
|
||||||
var avatarLowerArm = rootAnimator.GetBoneTransform(lowerArm);
|
|
||||||
var outfitLowerArm = avatarToOutfit(avatarLowerArm);
|
|
||||||
|
|
||||||
if (outfitArm == null) return;
|
|
||||||
if (outfitLowerArm == null) return;
|
|
||||||
|
|
||||||
if (Vector3.Dot((outfitLowerArm.position - outfitArm.position).normalized, (avatarLowerArm.position - avatarArm.position).normalized) > 0.999f) return;
|
|
||||||
|
|
||||||
// Rotate the outfit arm to ensure these two bone orientations match.
|
|
||||||
Undo.RecordObject(outfitArm, "Merge Armature: Force outfit position");
|
|
||||||
var relRot = Quaternion.FromToRotation(
|
|
||||||
outfitLowerArm.position - outfitArm.position,
|
|
||||||
avatarLowerArm.position - avatarArm.position
|
|
||||||
);
|
|
||||||
outfitArm.rotation = relRot * outfitArm.rotation;
|
|
||||||
PrefabUtility.RecordPrefabInstancePropertyModifications(outfitArm);
|
|
||||||
}
|
|
||||||
|
|
||||||
Transform avatarToOutfit(Transform avBone)
|
|
||||||
{
|
|
||||||
if (avBone == null) return null;
|
|
||||||
if (!avBone.IsChildOf(mergeTarget.transform)) return null;
|
|
||||||
var parts = RuntimeUtil.RelativePath(mergeTarget, avBone.gameObject)
|
|
||||||
.Split('/');
|
|
||||||
var outfitPath = string.Join("/", parts.Select(p => mama.prefix + p + mama.suffix));
|
|
||||||
var candidate = outfitArmature.transform.Find(outfitPath);
|
|
||||||
|
|
||||||
if (candidate == null) return null;
|
|
||||||
|
|
||||||
var merger = candidate.GetComponentInParent<ModularAvatarMergeArmature>();
|
|
||||||
if (merger != mama) return null;
|
|
||||||
|
|
||||||
return candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdjustRootScale()
|
void AdjustRootScale()
|
||||||
{
|
{
|
||||||
// Adjust the overall scale of the avatar based on wingspan (arm length)
|
// Adjust the overall scale of the avatar based on wingspan (arm length)
|
||||||
|
@ -229,7 +229,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void FixAPose(GameObject avatarRoot, Transform outfitArmature)
|
internal static void FixAPose(GameObject avatarRoot, Transform outfitArmature, bool strictMode = true)
|
||||||
{
|
{
|
||||||
var mergeArmature = outfitArmature.GetComponent<ModularAvatarMergeArmature>();
|
var mergeArmature = outfitArmature.GetComponent<ModularAvatarMergeArmature>();
|
||||||
if (mergeArmature == null) return;
|
if (mergeArmature == null) return;
|
||||||
@ -249,7 +249,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
{
|
{
|
||||||
var lowerArm = (HumanBodyBones)((int)arm + 2);
|
var lowerArm = (HumanBodyBones)((int)arm + 2);
|
||||||
|
|
||||||
// check if the rotation of the arm differs, but distances and origin point are the same
|
// check if the rotation of the arm differs(, but distances and origin point are the same when strictMode)
|
||||||
var avatarArm = rootAnimator.GetBoneTransform(arm);
|
var avatarArm = rootAnimator.GetBoneTransform(arm);
|
||||||
var outfitArm = avatarToOutfit(avatarArm);
|
var outfitArm = avatarToOutfit(avatarArm);
|
||||||
|
|
||||||
@ -259,22 +259,27 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
if (outfitArm == null) return;
|
if (outfitArm == null) return;
|
||||||
if (outfitLowerArm == null) return;
|
if (outfitLowerArm == null) return;
|
||||||
|
|
||||||
if ((avatarArm.position - outfitArm.position).magnitude > 0.001f) return;
|
if (strictMode)
|
||||||
|
{
|
||||||
|
if ((avatarArm.position - outfitArm.position).magnitude > 0.001f) return;
|
||||||
|
|
||||||
// check relative distance to lower arm as well
|
// check relative distance to lower arm as well
|
||||||
var avatarArmLength = (avatarLowerArm.position - avatarArm.position).magnitude;
|
var avatarArmLength = (avatarLowerArm.position - avatarArm.position).magnitude;
|
||||||
var outfitArmLength = (outfitLowerArm.position - outfitArm.position).magnitude;
|
var outfitArmLength = (outfitLowerArm.position - outfitArm.position).magnitude;
|
||||||
|
|
||||||
if (Mathf.Abs(avatarArmLength - outfitArmLength) > 0.001f) return;
|
if (Mathf.Abs(avatarArmLength - outfitArmLength) > 0.001f) return;
|
||||||
|
} else {
|
||||||
|
if (Vector3.Dot((outfitLowerArm.position - outfitArm.position).normalized, (avatarLowerArm.position - avatarArm.position).normalized) > 0.999f) return;
|
||||||
|
}
|
||||||
|
|
||||||
// Rotate the outfit arm to ensure these two points match.
|
// Rotate the outfit arm to ensure these two bone orientations match.
|
||||||
|
Undo.RecordObject(outfitArm, "Convert A/T Pose");
|
||||||
var relRot = Quaternion.FromToRotation(
|
var relRot = Quaternion.FromToRotation(
|
||||||
outfitLowerArm.position - outfitArm.position,
|
outfitLowerArm.position - outfitArm.position,
|
||||||
avatarLowerArm.position - avatarArm.position
|
avatarLowerArm.position - avatarArm.position
|
||||||
);
|
);
|
||||||
outfitArm.rotation = relRot * outfitArm.rotation;
|
outfitArm.rotation = relRot * outfitArm.rotation;
|
||||||
PrefabUtility.RecordPrefabInstancePropertyModifications(outfitArm);
|
PrefabUtility.RecordPrefabInstancePropertyModifications(outfitArm);
|
||||||
EditorUtility.SetDirty(outfitArm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform avatarToOutfit(Transform avBone)
|
Transform avatarToOutfit(Transform avBone)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user