VRM10のLookAtと結構仲良くなれました。
VRM1.x系のLookAtチョットデキルになったのでVMCProtocolでBlendShape(Expression)やボーンどちらでも目線送れるようになったゾ、VRM1.x系のLookAtはExpressionやControlRigのボーンの値が0のままだからちょっと工夫したゾ pic.twitter.com/OuwPLaBnk1
— 大福らな🧷ぱふぇらむ公式VTuber (@daifuk_lana) February 3, 2024
はじめに
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出来ます。
とりあえず作りかけてみたhttps://t.co/y8caRdRCGv
— さんたー (@santarh) September 28, 2023
これで、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系でも使用可能に仕上げています。
最新 #VMCProtocolミキサー v.0.1.8のデモ映像こんな感じ
— 大福らな🧷ぱふぇらむ公式VTuber (@daifuk_lana) January 31, 2024
アウトライン、シャドウ両方オンです
LuppetXの上半身とVRMポージングデスクトップの下半身を混ぜつつ、足先だけはLuppetXを活かして生感を持たせてます
waidayoから直接表情を受信出来るので、アイトラッキングや舌出しなども混ぜています pic.twitter.com/obv0B6zBOm
以上です。