ちょう恥ずかしい.....
VRM モデルのスケールを変更すると,髪揺れがおかしくなる件の対策 - ひつじTips で全然問題解決できてなかったっす.....
なんかなーーーーここで確かにGizmoの球の位置おかしーな~と思ってたんよなぁーーーーー
しかもまさかのTypo的なミスもしてるんよなぁーーーーーーーーーー
だめだ..深夜テンションで書くと絶対ミスってるので,一晩寝かせないといかんすな
(と言いつつ本記事も寝かさずにお気軽にUPしちゃうけど)
解決方法②
前記事と同じく,VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.cs
の287行目あたりからを,
今回は以下のように修正します.
foreach (var group in ColliderGroups)
{
+ var groupGlobalScale = Mathf.Max(Mathf.Max(group.transform.lossyScale.x,
+ group.transform.lossyScale.y),
+ group.transform.lossyScale.z);
if (group != null)
{
foreach (var collider in group.Colliders)
{
m_colliderList.Add(new SphereCollider
{
Position = group.transform.TransformPoint(collider.Offset),
- Radius = collider.Radius,
+ Radius = collider.Radius * groupGlobalScale,
});
}
}
}
}
var stiffness = m_stiffnessForce * Time.deltaTime;
var external = m_gravityDir * (m_gravityPower * Time.deltaTime);
+ var globalScale = Mathf.Max(Mathf.Max(transform.lossyScale.x,
+ transform.lossyScale.y),
+ transform.lossyScale.z);
foreach (var verlet in m_verlet)
{
- verlet.Radius = m_hitRadius;
+ verlet.Radius = m_hitRadius * globalScale;
verlet.Update(m_center,
stiffness,
m_dragForce,
external,
m_colliderList
);
}
}
前記事ではまさかのGlobalScaleの計算のところでTypoして,thisのtransform.lossyScale.zを持ってきちゃってたというね.
やっちまったね.
さらに加えて,HitRadius側にも修正入れてます.
これしないと,デフォルトのm_hitRadiusの大きさ(0.02f)が影響してくるぐらいモデルを小さくしたときに影響出ます(日本語不自由)
あとGizmo側も変更.
VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.cs
の33行目あたりからを,今回は以下のように修正.
Matrix4x4 mat = transform.localToWorldMatrix;
Gizmos.matrix = mat;
- Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
- 1.0f / transform.lossyScale.x,
- 1.0f / transform.lossyScale.y,
- 1.0f / transform.lossyScale.z
- ));
+ //Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
+ // 1.0f / transform.lossyScale.x,
+ // 1.0f / transform.lossyScale.y,
+ // 1.0f / transform.lossyScale.z
+ // ));
foreach (var y in Colliders)
{
Gizmos.DrawWireSphere(y.Offset, y.Radius);
}
ここコメントアウトするだけでよかった!!!!!
てかわざわざスケールの逆数をかけてるのだからこれはある意味仕様っぽい...でも変えたいんすけど...
個人的にはGizmoもロジック側と合わせて,以下のように書きたい...
- Matrix4x4 mat = transform.localToWorldMatrix;
- Gizmos.matrix = mat;
- Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
- 1.0f / transform.lossyScale.x,
- 1.0f / transform.lossyScale.y,
- 1.0f / transform.lossyScale.z
- ));
+ //Matrix4x4 mat = transform.localToWorldMatrix;
+ //Gizmos.matrix = mat;
+ //Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
+ // 1.0f / transform.lossyScale.x,
+ // 1.0f / transform.lossyScale.y,
+ // 1.0f / transform.lossyScale.z
+ // ));
+ var globalScale = Mathf.Max(Mathf.Max(transform.lossyScale.x,
+ transform.lossyScale.y),
+ transform.lossyScale.z);
foreach (var y in Colliders)
{
- Gizmos.DrawWireSphere(y.Offset, y.Radius);
+ Gizmos.DrawWireSphere(this.transform.TransformPoint(y.Offset), y.Radius* globalScale);
}
}
最後に
まだミスあったらどうしようかな...他人のコードむずいね...