2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VRM10のLookAtの仕様によってVMCProtocolの送信時に困った話

Last updated at Posted at 2024-02-03

VRM10のLookAtと結構仲良くなれました。

はじめに

VRM1.x系のLookAtの仕様では目線制御について、Expression制御の場合はLookUp~LookRightに直接値が入るわけでは無くWeight値が生成され、ボーン制御の場合はControlRigのボーンが直接操作される訳では無くlocalRotationが生成されます。

そのため、LookAtで視線制御された表情をVMCProtocolで送信する際、単にExpressionの値を取得したり、Animator.GetBoneTransform(hogehoge)で取ってきたボーンの回転を送ろうにも、値が0であるために目線が送信出来ない、ということが起こります。

詳細なVRM1.x系のLookAtの仕様は以下に記載されています。

今回私が解決した方法をメモがてら残しておきます。
上記前提含め間違っていたらごめんなさい。

Expressionの場合

LookAtを色々触っているうちに、以下のコードでLookAt時の目線のピッチとヨーを取得出来ることが分かりました。

Vrm10Instance.Runtime.LookAt.Pitch
Vrm10Instance.Runtime.LookAt.Yaw

そのため、このピッチ及びヨーの値から、ExpressionのLookUp~LookRightに相当する値を生成することにしました。
Expressionの値に比べ方向や桁が異なるため、適切な値となるよう計算します。
私の場合は*-0.01fしました。

そして、ピッチとヨーがそれぞれ0以上である場合、未満である場合でLookUp~LookRightを切り分けていきます。
2値であるため、上下左右がプラスマイナスで表現されています。
VRM0.x系のBlendShapeにSetする場合、左右なら例えば以下でしょうか。

if (yaw > 0)
{
 VRMBlendShapeProxy.ImmediatelySetValue(BlendShapePreset.LookLeft, yaw);
}
if (yaw <= 0)
{
 VRMBlendShapeProxy.ImmediatelySetValue(BlendShapePreset.LookRight, -yaw);
}

なお、私の場合はさんたーPさんにVRM1.x系と0.x系の表情互換APIを作って頂きましたので、同様のコードでExpressionにもSet出来ます。

これで、Expressionの値は生成出来ました。

なお、LookAtの仕様を読む限り、LookAtから生成されたWeight値がExpressionにSetされており、そのWeight値を取ってくれば良いのでは?と考えたのですがVrm10Instance.Runtime.Expression.GetWeight(hogehoge)しても0でした。何故……

ボーンの場合

こちらは単純で、LookAtからlocalRotationが生成されており、仕様の中にも記載の通りvrm.humanoid.leftEye.localRotation = Quaternion.from_YXZEuler(yaw, pitch, 0);とあるため、以下のコードで左右の目の回転が取得出来ます。

Vrm10Instance.Humanoid.LeftEye.localRotation
Vrm10Instance.Humanoid.RightEye.localRotation

簡単です。

最後に

ここまでで取得出来た値をVMCProtocolで送信すれば、LookAtのターゲット座標を転送せずとも目線情報が送信可能です。
Expressionの方は、もう少し賢いやり方が、というかもう少し正しい値の取得方法があるかもしれません。
ボーンを触ってても思いますが、VRM1.x系は、まずはVrm10Instanceなんだと感じて面白いです。

なお、これらの知見を活かして開発を進めているのがVMCProtocolミキサーです。
VRoid Hubにも対応している都合上、VRM1.x系でも使用可能に仕上げています。

以上です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?