Merge pull request #1986 from Santarh/lookAtHierarcy

Add a LookAtOrigin transform to ControlRig.
This commit is contained in:
Masataka SUMI
2023-02-17 17:55:42 +09:00
committed by GitHub
2 changed files with 12 additions and 10 deletions

View File

@@ -63,7 +63,7 @@ namespace UniVRM10
ControlRig = new Vrm10RuntimeControlRig(target.Humanoid, m_target.transform, controlRigInitialRotations);
}
Constraints = target.GetComponentsInChildren<IVrm10Constraint>();
LookAt = new Vrm10RuntimeLookAt(target.Vrm.LookAt, target.Humanoid, m_head);
LookAt = new Vrm10RuntimeLookAt(target.Vrm.LookAt, target.Humanoid, ControlRig);
Expression = new Vrm10RuntimeExpression(target, LookAt, LookAt.EyeDirectionApplicable);
var instance = target.GetComponent<RuntimeGltfInstance>();

View File

@@ -30,11 +30,13 @@ namespace UniVRM10
/// </summary>
public Transform LookAtOriginTransform { get; }
internal Vrm10RuntimeLookAt(VRM10ObjectLookAt lookAt, UniHumanoid.Humanoid humanoid, Transform head)
internal Vrm10RuntimeLookAt(VRM10ObjectLookAt lookAt, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig)
{
_lookAt = lookAt;
_head = head;
LookAtOriginTransform = InitializeEyePositionTransform(_head, _lookAt.OffsetFromHead);
LookAtOriginTransform = InitializeLookAtOriginTransform(
humanoid.Head,
controlRig != null ? controlRig.GetBoneTransform(HumanBodyBones.Head) : humanoid.Head,
_lookAt.OffsetFromHead);
_lookAtOriginTransformLocalPosition = LookAtOriginTransform.localPosition;
_lookAtOriginTransformLocalRotation = LookAtOriginTransform.localRotation;
@@ -92,17 +94,17 @@ namespace UniVRM10
return (yaw, pitch);
}
private static Transform InitializeEyePositionTransform(Transform head, Vector3 eyeOffsetValue)
private static Transform InitializeLookAtOriginTransform(Transform rawHead, Transform actualHead, Vector3 eyeOffsetValue)
{
if (!Application.isPlaying) return null;
// NOTE: このメソッドを実行するとき、モデル全体は初期姿勢T-Poseでなければならない。
var eyePositionTransform = new GameObject("_eye_transform_").transform;
eyePositionTransform.SetParent(head);
eyePositionTransform.localPosition = eyeOffsetValue;
eyePositionTransform.rotation = Quaternion.identity;
var lookAtOrigin = new GameObject("_look_at_origin_").transform;
lookAtOrigin.SetParent(actualHead);
lookAtOrigin.position = rawHead.TransformPoint(eyeOffsetValue);
lookAtOrigin.rotation = Quaternion.identity;
return eyePositionTransform;
return lookAtOrigin;
}
#region Obsolete