LookAtEyeDirection を Yaw, Pitch 二値に縮小。

左目と右目の独立はまたの機会に・・・
This commit is contained in:
ousttrue
2023-08-18 18:13:02 +09:00
parent 0c4f768eb2
commit f514e89962
4 changed files with 25 additions and 41 deletions

View File

@@ -2,43 +2,24 @@
{
public readonly struct LookAtEyeDirection
{
/// <summary>
/// Yaw of LeftEye
/// </summary>
public float LeftYaw { get; }
public float Yaw { get; }
/// <summary>
/// Pitch of LeftEye
/// </summary>
public float LeftPitch { get; }
/// <summary>
/// NOTE: 何故か使われていない
/// Yaw of RightEye
/// </summary>
public float RightYaw { get; }
/// <summary>
/// NOTE: 何故か使われていない
/// Pitch of RightEye
/// </summary>
public float RightPitch { get; }
public float Pitch { get; }
public LookAtEyeDirection(float leftYaw, float leftPitch, float rightYaw, float rightPitch)
public LookAtEyeDirection(float yaw, float pitch)
{
LeftYaw = leftYaw;
LeftPitch = leftPitch;
RightYaw = rightYaw;
RightPitch = rightPitch;
Yaw = yaw;
Pitch = pitch;
}
public static LookAtEyeDirection Multiply(LookAtEyeDirection a, float b)
{
return new LookAtEyeDirection(
a.LeftYaw * b,
a.LeftPitch * b,
a.RightYaw * b,
a.RightPitch * b
a.Yaw * b,
a.Pitch * b
);
}
}

View File

@@ -20,7 +20,7 @@ namespace UniVRM10
CurveMapper horizontalOuter, CurveMapper horizontalInner, CurveMapper verticalDown, CurveMapper verticalUp)
{
_leftEye = leftEye;
_leftInit= Matrix4x4.Rotate(leftEye.localRotation);
_leftInit = Matrix4x4.Rotate(leftEye.localRotation);
_rightEye = rightEye;
_rightInit = Matrix4x4.Rotate(rightEye.localRotation);
_horizontalOuter = horizontalOuter;
@@ -35,9 +35,9 @@ namespace UniVRM10
public void Apply(LookAtEyeDirection eyeDirection, Dictionary<ExpressionKey, float> actualWeights)
{
// FIXME
var yaw = eyeDirection.LeftYaw;
var pitch = eyeDirection.LeftPitch;
var yaw = eyeDirection.Yaw;
var pitch = eyeDirection.Pitch;
// horizontal
float leftYaw, rightYaw;
if (yaw < 0)
@@ -62,20 +62,23 @@ namespace UniVRM10
}
// Apply
SetYawPitchToBones(new LookAtEyeDirection(leftYaw, pitch, rightYaw, pitch));
// 現状、右目左目を個別に動かす機能は無い。
// 特に BlendShape 型に対して実装と、Asset のセットアップが煩雑になるので見送っている。
// 代表して左を採用。
SetYawPitchToBones(new LookAtEyeDirection(leftYaw, pitch));
}
public void Restore()
{
SetYawPitchToBones(new LookAtEyeDirection(0, 0, 0, 0));
SetYawPitchToBones(new LookAtEyeDirection(0, 0));
}
private void SetYawPitchToBones(LookAtEyeDirection actualEyeDirection)
{
if (_leftEye != null && _rightEye != null)
{
_leftEye.localRotation = _leftInit.rotation * Matrix4x4.identity.YawPitchRotation(actualEyeDirection.LeftYaw, actualEyeDirection.LeftPitch);
_rightEye.localRotation = _rightInit.rotation * Matrix4x4.identity.YawPitchRotation(actualEyeDirection.RightYaw, actualEyeDirection.RightPitch);
_leftEye.localRotation = _leftInit.rotation * Matrix4x4.identity.YawPitchRotation(actualEyeDirection.Yaw, actualEyeDirection.Pitch);
_rightEye.localRotation = _rightInit.rotation * Matrix4x4.identity.YawPitchRotation(actualEyeDirection.Yaw, actualEyeDirection.Pitch);
}
}
}

View File

@@ -27,8 +27,8 @@ namespace UniVRM10
public void Apply(LookAtEyeDirection eyeDirection, Dictionary<ExpressionKey, float> actualWeights)
{
var yaw = eyeDirection.LeftYaw;
var pitch = eyeDirection.LeftPitch;
var yaw = eyeDirection.Yaw;
var pitch = eyeDirection.Pitch;
if (yaw < 0)
{

View File

@@ -22,8 +22,8 @@ namespace UniVRM10
/// 出力値。Process() のみが更新する
/// </summary>
public LookAtEyeDirection EyeDirection { get; private set; }
public float Yaw => EyeDirection.LeftYaw;
public float Pitch => EyeDirection.LeftPitch;
public float Yaw => EyeDirection.Yaw;
public float Pitch => EyeDirection.Pitch;
/// <summary>
/// Transform that indicates the position center of eyes.
@@ -73,7 +73,7 @@ namespace UniVRM10
{
// NOTE: 指定された Transform の位置を向くように Yaw/Pitch を計算して適用する
var (yaw, pitch) = CalculateYawPitchFromLookAtPosition(worldPosition);
EyeDirection = new LookAtEyeDirection(yaw, pitch, 0, 0);
EyeDirection = new LookAtEyeDirection(yaw, pitch);
}
return EyeDirection;
}
@@ -86,7 +86,7 @@ namespace UniVRM10
/// <param name="pitch">Headボーンのforwardに対するpitch角(度)</param>
public void SetYawPitchManually(float yaw, float pitch)
{
LookAtInput = new LookAtInput { YawPitch = new LookAtEyeDirection(yaw, pitch, 0, 0) };
LookAtInput = new LookAtInput { YawPitch = new LookAtEyeDirection(yaw, pitch) };
}
public (float Yaw, float Pitch) CalculateYawPitchFromLookAtPosition(Vector3 lookAtWorldPosition)