@@ -13,7 +13,6 @@ public class VRMAnimationSync : MonoBehaviour
1313 private Animator orgAnim , vrmAnim ;
1414 private HumanPoseHandler orgPose , vrmPose ;
1515 private HumanPose hp = new HumanPose ( ) ;
16- private float height = 0.0f ;
1716 private bool ragdoll ;
1817 private float offset ;
1918
@@ -37,8 +36,6 @@ void PoseHandlerCreate(Animator org, Animator vrm)
3736 OnDestroy ( ) ;
3837 orgPose = new HumanPoseHandler ( org . avatar , org . transform ) ;
3938 vrmPose = new HumanPoseHandler ( vrm . avatar , vrm . transform ) ;
40-
41- height = vrmAnim . GetBoneTransform ( HumanBodyBones . Hips ) . position . y - orgAnim . GetBoneTransform ( HumanBodyBones . Hips ) . position . y ;
4239 }
4340
4441 void OnDestroy ( )
@@ -49,27 +46,81 @@ void OnDestroy()
4946 vrmPose . Dispose ( ) ;
5047 }
5148
52- void Update ( )
49+ private float CalcFootSub ( )
5350 {
54- if ( ragdoll ) return ;
55- for ( var i = 0 ; i < 55 ; i ++ )
56- {
57- var orgTrans = orgAnim . GetBoneTransform ( ( HumanBodyBones ) i ) ;
58- var vrmTrans = vrmAnim . GetBoneTransform ( ( HumanBodyBones ) i ) ;
51+ var orgRightFoot = orgAnim . GetBoneTransform ( HumanBodyBones . RightFoot ) . position ;
52+ var orgLeftFoot = orgAnim . GetBoneTransform ( HumanBodyBones . LeftFoot ) . position ;
53+ var orgArgFoot = ( orgRightFoot + orgLeftFoot ) * 0.5f ;
5954
60- if ( i > 0 && orgTrans != null && vrmTrans != null )
61- {
62- orgTrans . position = vrmTrans . position ;
63- }
64- }
55+ var vrmRightFoot = vrmAnim . GetBoneTransform ( HumanBodyBones . RightFoot ) . position ;
56+ var vrmLeftFoot = vrmAnim . GetBoneTransform ( HumanBodyBones . LeftFoot ) . position ;
57+ var vrmArgFoot = ( vrmRightFoot + vrmLeftFoot ) * 0.5f ;
58+
59+ return ( orgArgFoot - vrmArgFoot ) . y ;
6560 }
6661
62+ private static List < int > alreadyHashes = new List < int > ( ) ;
63+
64+ // 最初: -161139084
65+ // 通常: 229373857
66+ // 最初立ち上がり: -1536343465
67+ // 立ち上がり: -805461806
68+ // 座り始め: 890925016
69+ // 座り: -1544306596
70+ // 椅子: -1829310159
71+ // ベッド寝始め: 337039637
72+ // ベッド: -1603096
73+ // ベッド起き上がり: -496559199
74+ // Crouch: -2015693266
75+
76+ private static List < int > adjustHipHashes = new List < int > ( )
77+ {
78+ - 1536343465 ,
79+ 890925016 ,
80+ - 1544306596 ,
81+ - 1829310159 ,
82+ 337039637 ,
83+ - 1603096 ,
84+ - 496559199 ,
85+ } ;
86+
87+
6788 void LateUpdate ( )
6889 {
90+ vrmAnim . transform . localPosition = Vector3 . zero ;
91+ var orgHipPos = orgAnim . GetBoneTransform ( HumanBodyBones . Hips ) . position ;
6992 orgPose . GetHumanPose ( ref hp ) ;
7093 vrmPose . SetHumanPose ( ref hp ) ;
7194
72- var posY = orgAnim . GetBoneTransform ( HumanBodyBones . Hips ) . position . y ;
95+ var nameHash = orgAnim . GetCurrentAnimatorStateInfo ( 0 ) . shortNameHash ;
96+ var adjustFromHip = adjustHipHashes . Contains ( nameHash ) ;
97+
98+ //if (!alreadyHashes.Contains(nameHash))
99+ //{
100+ // alreadyHashes.Add(nameHash);
101+ // Debug.Log(orgAnim.GetCurrentAnimatorClipInfo(0)[0].clip.name + ": " + nameHash);
102+ //}
103+
104+ var vrmHip = vrmAnim . GetBoneTransform ( HumanBodyBones . Hips ) ;
105+ if ( adjustFromHip )
106+ {
107+ vrmHip . position = orgHipPos ;
108+ }
109+
110+ var adjustHeight = 0.0f ;
111+ if ( nameHash == 890925016 || nameHash == - 1544306596 || nameHash == - 1829310159 ) // Sitting
112+ {
113+ adjustHeight += 0.1f ;
114+ }
115+
116+ if ( ! adjustFromHip )
117+ {
118+ adjustHeight = CalcFootSub ( ) ;
119+ }
120+
121+ var pos = vrmHip . position ;
122+ pos . y += adjustHeight ;
123+ vrmHip . position = pos ;
73124
74125 if ( ! ragdoll )
75126 {
@@ -85,9 +136,7 @@ void LateUpdate()
85136 }
86137 }
87138
88- var pos = vrmAnim . transform . position ;
89- pos . y = posY + height + offset ;
90- vrmAnim . transform . position = pos ;
139+ vrmAnim . transform . localPosition += Vector3 . up * offset ;
91140 }
92141 }
93142}
0 commit comments