Fix : 신체가 길어지는 버그 해결
This commit is contained in:
parent
d2a28e133a
commit
52d9e9f548
@ -192,9 +192,10 @@ namespace KindRetargeting
|
|||||||
private Dictionary<int, float[]> fingerFilterBuffers = new Dictionary<int, float[]>();
|
private Dictionary<int, float[]> fingerFilterBuffers = new Dictionary<int, float[]>();
|
||||||
private Dictionary<int, int> fingerFilterIndices = new Dictionary<int, int>();
|
private Dictionary<int, int> fingerFilterIndices = new Dictionary<int, int>();
|
||||||
|
|
||||||
// CopyFingerPoseByMuscle에서 사용할 본 Transform 저장용 (메모리 재사용)
|
// CopyFingerPoseByMuscle에서 사용할 본 로컬 회전 저장용 (메모리 재사용)
|
||||||
private Dictionary<HumanBodyBones, (Vector3 position, Quaternion rotation)> savedBoneTransforms =
|
// 위치는 SetHumanPose가 처리하므로 회전만 저장
|
||||||
new Dictionary<HumanBodyBones, (Vector3, Quaternion)>();
|
private Dictionary<HumanBodyBones, Quaternion> savedBoneLocalRotations =
|
||||||
|
new Dictionary<HumanBodyBones, Quaternion>();
|
||||||
|
|
||||||
// 손가락을 제외한 모든 휴먼본 목록 (캐싱)
|
// 손가락을 제외한 모든 휴먼본 목록 (캐싱)
|
||||||
private static readonly HumanBodyBones[] nonFingerBones = new HumanBodyBones[]
|
private static readonly HumanBodyBones[] nonFingerBones = new HumanBodyBones[]
|
||||||
@ -1364,14 +1365,14 @@ namespace KindRetargeting
|
|||||||
if (sourcePoseHandler == null || targetPoseHandler == null)
|
if (sourcePoseHandler == null || targetPoseHandler == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// 1. 손가락을 제외한 모든 본의 위치/회전 저장
|
// 1. 손가락을 제외한 모든 본의 로컬 회전 저장 (위치는 복원 불필요)
|
||||||
savedBoneTransforms.Clear();
|
savedBoneLocalRotations.Clear();
|
||||||
for (int i = 0; i < nonFingerBones.Length; i++)
|
for (int i = 0; i < nonFingerBones.Length; i++)
|
||||||
{
|
{
|
||||||
Transform bone = targetAnimator.GetBoneTransform(nonFingerBones[i]);
|
Transform bone = targetAnimator.GetBoneTransform(nonFingerBones[i]);
|
||||||
if (bone != null)
|
if (bone != null)
|
||||||
{
|
{
|
||||||
savedBoneTransforms[nonFingerBones[i]] = (bone.position, bone.rotation);
|
savedBoneLocalRotations[nonFingerBones[i]] = bone.localRotation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1408,13 +1409,13 @@ namespace KindRetargeting
|
|||||||
// 3. 머슬 포즈 적용 (손가락 포함 전체 본에 영향)
|
// 3. 머슬 포즈 적용 (손가락 포함 전체 본에 영향)
|
||||||
targetPoseHandler.SetHumanPose(ref targetPose);
|
targetPoseHandler.SetHumanPose(ref targetPose);
|
||||||
|
|
||||||
// 4. 손가락을 제외한 모든 본의 위치/회전 복원
|
// 4. 손가락을 제외한 모든 본의 로컬 회전 복원 (위치는 복원하지 않음 - 본 길이 변형 방지)
|
||||||
foreach (var kvp in savedBoneTransforms)
|
foreach (var kvp in savedBoneLocalRotations)
|
||||||
{
|
{
|
||||||
Transform bone = targetAnimator.GetBoneTransform(kvp.Key);
|
Transform bone = targetAnimator.GetBoneTransform(kvp.Key);
|
||||||
if (bone != null)
|
if (bone != null)
|
||||||
{
|
{
|
||||||
bone.SetPositionAndRotation(kvp.Value.position, kvp.Value.rotation);
|
bone.localRotation = kvp.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1518,14 +1519,14 @@ namespace KindRetargeting
|
|||||||
if (sourcePoseHandler == null || targetPoseHandler == null)
|
if (sourcePoseHandler == null || targetPoseHandler == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// 1. 손가락을 제외한 모든 본의 위치/회전 저장
|
// 1. 손가락을 제외한 모든 본의 로컬 회전 저장 (위치는 복원 불필요)
|
||||||
savedBoneTransforms.Clear();
|
savedBoneLocalRotations.Clear();
|
||||||
for (int i = 0; i < nonFingerBones.Length; i++)
|
for (int i = 0; i < nonFingerBones.Length; i++)
|
||||||
{
|
{
|
||||||
Transform bone = targetAnimator.GetBoneTransform(nonFingerBones[i]);
|
Transform bone = targetAnimator.GetBoneTransform(nonFingerBones[i]);
|
||||||
if (bone != null)
|
if (bone != null)
|
||||||
{
|
{
|
||||||
savedBoneTransforms[nonFingerBones[i]] = (bone.position, bone.rotation);
|
savedBoneLocalRotations[nonFingerBones[i]] = bone.localRotation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1586,13 +1587,13 @@ namespace KindRetargeting
|
|||||||
// 4. 머슬 포즈 적용
|
// 4. 머슬 포즈 적용
|
||||||
targetPoseHandler.SetHumanPose(ref targetPose);
|
targetPoseHandler.SetHumanPose(ref targetPose);
|
||||||
|
|
||||||
// 5. 손가락을 제외한 모든 본의 위치/회전 복원
|
// 5. 손가락을 제외한 모든 본의 로컬 회전 복원 (위치는 복원하지 않음 - 본 길이 변형 방지)
|
||||||
foreach (var kvp in savedBoneTransforms)
|
foreach (var kvp in savedBoneLocalRotations)
|
||||||
{
|
{
|
||||||
Transform bone = targetAnimator.GetBoneTransform(kvp.Key);
|
Transform bone = targetAnimator.GetBoneTransform(kvp.Key);
|
||||||
if (bone != null)
|
if (bone != null)
|
||||||
{
|
{
|
||||||
bone.SetPositionAndRotation(kvp.Value.position, kvp.Value.rotation);
|
bone.localRotation = kvp.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
[DefaultExecutionOrder(2)]
|
[DefaultExecutionOrder(2)]
|
||||||
public class FingerShapedController : MonoBehaviour
|
public class FingerShapedController : MonoBehaviour
|
||||||
@ -6,6 +7,39 @@ public class FingerShapedController : MonoBehaviour
|
|||||||
private Animator animator;
|
private Animator animator;
|
||||||
private HumanPoseHandler humanPoseHandler;
|
private HumanPoseHandler humanPoseHandler;
|
||||||
|
|
||||||
|
// 손가락을 제외한 모든 본의 로컬 회전 저장용 (SetHumanPose 호출 시 몸 복원용)
|
||||||
|
private Dictionary<HumanBodyBones, Quaternion> savedBoneLocalRotations = new Dictionary<HumanBodyBones, Quaternion>();
|
||||||
|
|
||||||
|
// 손가락을 제외한 모든 휴먼본 목록
|
||||||
|
private static readonly HumanBodyBones[] nonFingerBones = new HumanBodyBones[]
|
||||||
|
{
|
||||||
|
HumanBodyBones.Hips,
|
||||||
|
HumanBodyBones.Spine,
|
||||||
|
HumanBodyBones.Chest,
|
||||||
|
HumanBodyBones.UpperChest,
|
||||||
|
HumanBodyBones.Neck,
|
||||||
|
HumanBodyBones.Head,
|
||||||
|
HumanBodyBones.LeftShoulder,
|
||||||
|
HumanBodyBones.LeftUpperArm,
|
||||||
|
HumanBodyBones.LeftLowerArm,
|
||||||
|
HumanBodyBones.LeftHand,
|
||||||
|
HumanBodyBones.RightShoulder,
|
||||||
|
HumanBodyBones.RightUpperArm,
|
||||||
|
HumanBodyBones.RightLowerArm,
|
||||||
|
HumanBodyBones.RightHand,
|
||||||
|
HumanBodyBones.LeftUpperLeg,
|
||||||
|
HumanBodyBones.LeftLowerLeg,
|
||||||
|
HumanBodyBones.LeftFoot,
|
||||||
|
HumanBodyBones.LeftToes,
|
||||||
|
HumanBodyBones.RightUpperLeg,
|
||||||
|
HumanBodyBones.RightLowerLeg,
|
||||||
|
HumanBodyBones.RightFoot,
|
||||||
|
HumanBodyBones.RightToes,
|
||||||
|
HumanBodyBones.LeftEye,
|
||||||
|
HumanBodyBones.RightEye,
|
||||||
|
HumanBodyBones.Jaw
|
||||||
|
};
|
||||||
|
|
||||||
[Header("왼손 제어 값")]
|
[Header("왼손 제어 값")]
|
||||||
[Range(-1, 1)] public float leftPinkyCurl; // 새끼손가락 구부리기
|
[Range(-1, 1)] public float leftPinkyCurl; // 새끼손가락 구부리기
|
||||||
[Range(-1, 1)] public float leftRingCurl; // 약지 구부리기
|
[Range(-1, 1)] public float leftRingCurl; // 약지 구부리기
|
||||||
@ -54,6 +88,18 @@ public class FingerShapedController : MonoBehaviour
|
|||||||
|
|
||||||
private void UpdateMuscleValues()
|
private void UpdateMuscleValues()
|
||||||
{
|
{
|
||||||
|
// 1. 손가락을 제외한 모든 본의 로컬 회전 저장 (SetHumanPose 호출 전)
|
||||||
|
savedBoneLocalRotations.Clear();
|
||||||
|
for (int i = 0; i < nonFingerBones.Length; i++)
|
||||||
|
{
|
||||||
|
Transform bone = animator.GetBoneTransform(nonFingerBones[i]);
|
||||||
|
if (bone != null)
|
||||||
|
{
|
||||||
|
savedBoneLocalRotations[nonFingerBones[i]] = bone.localRotation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. HumanPose 가져오기 및 손가락 머슬 설정
|
||||||
HumanPose humanPose = new HumanPose();
|
HumanPose humanPose = new HumanPose();
|
||||||
humanPoseHandler.GetHumanPose(ref humanPose);
|
humanPoseHandler.GetHumanPose(ref humanPose);
|
||||||
|
|
||||||
@ -65,7 +111,18 @@ public class FingerShapedController : MonoBehaviour
|
|||||||
SetHandMuscles(false, rightThumbCurl, rightIndexCurl, rightMiddleCurl, rightRingCurl,
|
SetHandMuscles(false, rightThumbCurl, rightIndexCurl, rightMiddleCurl, rightRingCurl,
|
||||||
rightPinkyCurl, rightSpreadFingers, ref humanPose);
|
rightPinkyCurl, rightSpreadFingers, ref humanPose);
|
||||||
|
|
||||||
|
// 3. 머슬 포즈 적용 (손가락 포함 전체 본에 영향)
|
||||||
humanPoseHandler.SetHumanPose(ref humanPose);
|
humanPoseHandler.SetHumanPose(ref humanPose);
|
||||||
|
|
||||||
|
// 4. 손가락을 제외한 모든 본의 로컬 회전 복원 (본 길이 변형 방지)
|
||||||
|
foreach (var kvp in savedBoneLocalRotations)
|
||||||
|
{
|
||||||
|
Transform bone = animator.GetBoneTransform(kvp.Key);
|
||||||
|
if (bone != null)
|
||||||
|
{
|
||||||
|
bone.localRotation = kvp.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetHandMuscles(bool isLeft, float thumb, float index, float middle, float ring,
|
private void SetHandMuscles(bool isLeft, float thumb, float index, float middle, float ring,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user