Merge pull request #2445 from ousttrue/fix/vrm10_lookat_initialization

lookAt は root と同じ向きが初期姿勢
This commit is contained in:
ousttrue 2024-09-25 16:38:44 +09:00 committed by GitHub
commit d6e920b6d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 11 deletions

View File

@ -56,7 +56,7 @@ namespace UniVRM10
ControlRig = new Vrm10RuntimeControlRig(instance.Humanoid, m_instance.transform);
}
Constraints = instance.GetComponentsInChildren<IVrm10Constraint>();
LookAt = new Vrm10RuntimeLookAt(instance.Vrm.LookAt, instance.Humanoid, ControlRig);
LookAt = new Vrm10RuntimeLookAt(instance, instance.Humanoid, ControlRig);
Expression = new Vrm10RuntimeExpression(instance, LookAt.EyeDirectionApplicable);
SpringBone = springBoneRuntime;
}

View File

@ -38,13 +38,16 @@ namespace UniVRM10
/// </summary>
public Transform LookAtOriginTransform { get; }
internal Vrm10RuntimeLookAt(VRM10ObjectLookAt lookAt, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig)
internal Vrm10RuntimeLookAt(Vrm10Instance instance, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig)
{
_lookAt = lookAt;
_lookAt = instance.Vrm.LookAt;
LookAtOriginTransform = InitializeLookAtOriginTransform(
humanoid.Head,
controlRig != null ? controlRig.GetBoneTransform(HumanBodyBones.Head) : humanoid.Head,
_lookAt.OffsetFromHead);
humanoid,
controlRig,
_lookAt.OffsetFromHead,
instance.transform.rotation);
_lookAtOriginTransformLocalPosition = LookAtOriginTransform.localPosition;
_lookAtOriginTransformLocalRotation = LookAtOriginTransform.localRotation;
@ -96,13 +99,35 @@ namespace UniVRM10
return (yaw, pitch);
}
private static Transform InitializeLookAtOriginTransform(Transform rawHead, Transform actualHead, Vector3 eyeOffsetValue)
/// <summary>
/// Generate empty object for gaze calculation.
/// NOTE: このメソッドを実行するとき、モデル全体は初期姿勢T-Poseでなければならない。
/// NOTE: Vrm10Instance.Runtime 呼び出しによりトリガーされる。
/// From v0.127.0: VRM Root Vrm10Instance が Add されているGameObject は初期姿勢でなくてもよい #2445
/// </summary>
/// <param name="humanoid"></param>
/// <param name="controlRig">if provided parent is controlrig head else humanoid head</param>
/// <param name="eyeOffsetValue">A humanoid head local offset</param>
/// <param name="rootRotation">world rotation of vrm model</param>
/// <returns></returns>
private static Transform InitializeLookAtOriginTransform(UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig,
Vector3 eyeOffsetValue, Quaternion rootRotation)
{
// NOTE: このメソッドを実行するとき、モデル全体は初期姿勢T-Poseでなければならない。
var lookAtOrigin = new GameObject("_look_at_origin_").transform;
lookAtOrigin.SetParent(actualHead);
lookAtOrigin.position = rawHead.TransformPoint(eyeOffsetValue);
lookAtOrigin.rotation = Quaternion.identity;
if (controlRig != null)
{
// controlRig のHeadに連結
lookAtOrigin.SetParent(controlRig.GetBoneTransform(HumanBodyBones.Head));
}
else
{
// humanoid のHeadに連結
lookAtOrigin.SetParent(humanoid.Head);
}
lookAtOrigin.position = humanoid.Head.TransformPoint(eyeOffsetValue);
// v0.127.0
lookAtOrigin.rotation = rootRotation;
return lookAtOrigin;
}