JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

VTuberになりたい!(Tips編)

女子高生になりたい。 せや、バーチャルユーチューバーになればええんや!

ということで、VTuber環境を構築したメモです。

成果物はこの記事に置いてます。

sakataharumi.hatenablog.jp

使用したもの

[VR Device]

  • HTC Vive

[ソフトウェア]

  • Unity(開発)
  • OBS Studio(動画撮影)

[Unity Plugin]

  • MMD4Mecanim
  • Finak IK
  • OVRLipSync
  • SteamVR Plugin
  • VIVE Input Utility for Unity

[モデル]

制作

だいたい作り方は Unity+Vive+MMD+VRIKで、キズナアイちゃんになりきりVR - Qiita などに載っています。

流れとしては、

  1. MMDモデルをUnityで使用可能な形式に変換
  2. SteamVR PluginのCameraRig, Status, StreamVRをヒエラルキ上に置く
  3. Final IKの設定をする
  4. OVRLipSyncの設定をする
  5. HMDから自分が見えるように鏡を置く
  6. 腕の角度や足の角度を調節する
  7. 表情をキーボードやViveコントローラで変えられるようにする
  8. 撮影

って感じです。

以下はちょっと迷ったところとか、個人的にメモっときたい事を書いときます。

Final IK

IK(= Inverse Kinematics)日本語では逆運動学になります

順運動学は、例えば腕が○度曲がったから手の位置はココ!みたいな計算をします。

それに対し、逆運動学では、手の位置がココだから腕は○度曲がってる!というような計算をします。

Viveにより、頭の位置、手の位置がトラッキングできるので、これで手の角度や足の曲がり具合などをIKにより計算するわけです。

FinalIKの設定で、VRIK Scriptをアタッチした際のReferencesですが、デフォルトでは全てNoneになっていました(自動で参照してくれない)

VRIKのコンポーネント上で右クリックするとAuto-detect Referencesという項目があったので、これで自動選択してくれました。。

f:id:sakata_harumi:20180504173048p:plain

ただし、一部自動で設定されない項目や誤っている項目がありました(多分)。最終的に、自分は以下のように設定しました。

f:id:sakata_harumi:20180504173742p:plain

OVRLipSync

うまく口が動いてくれない事がありました。 口の動きが小さいからといってGainを極端に大きくしても変わらなかったように見えます。 (しかもキツイノイズが入るようになった)

最終的には、Gain 10くらいでハッキリと口が動くようになりました。

マイク指してGameシーンをPreviewした直後は認識しないのかな?ちょっと待ったら動くようになった気がする・・?

この辺りはよくわかってないです。

表情の変更

表情はキズナアイモデルの、U_Char_1にアタッチされてるSkinned Mesh Rendererの値を操作(1~100)する事で変更可能です。

f:id:sakata_harumi:20180504174449p:plain

ScriptではSkinnedMeshRendererコンポーネントのSetBlendShapeWeightで変更できます。

public SkinnedMeshRenderer skinnedMeshRenderer;

this.skinnedMeshRenderer.SetBlendShapeWeight (0, 100);

今回、Viewのトリガーボタン、丸いトラックパッドを押した時に表情を変更するようにしました。 ボタン押下中は特定の表情のweightを増加させ、表情を徐々に変化させます。

ViveのボタンはSteamVR_Controller.Inputから取得できます。

var device = SteamVR_Controller.Input ((int)vrTrack.index);
device.GetPress(SteamVR_Controller.ButtonMask.Trigger);

(トリガー押下)

トラックパッドの指の位置はGetAxis()で取れますが、ボタンを押した時のみに反応するには.GetPress(SteamVR_Controller.ButtonMask.Touchpad)と組み合わせる必要があります。

if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad)){
  if(device.GetAxis().y < 0 && device.GetAxis().x > 0){
    // something
  }
}

成果物

次の記事で公開します

sakataharumi.hatenablog.jp

(イメージ)

f:id:sakata_harumi:20180504180249p:plain