
VR 招かれざる客
- Blender
- Oculus
- Rift
- Touch
- Unity
- VR
2017.7.15
#DESCRIPTION
“VR 招かれざる客”は、Oculus Rift&Touchを使用するVRコンテンツです。
プレイヤーはVR空間内で美少女となり、夜、”招かれざる客”の応対を行います。
プレイヤーが招かれざる客に対して行えること
- 押し倒す
- 平手打ち
- グーパン
- and more!(プレイヤーの想像力次第)
#SOURCE OF IDEAS –part.1–
某ドラマのエンディングで踊る女優さんが可愛いすぎたので、3Dモデル化したい衝動にかられました。
書籍:[Blender標準テクニック ローポリキャラクター制作で学ぶ3DCG]を参考に作ってみました。
書籍:Blender標準テクニック ローポリキャラクター制作で学ぶ3DCG
さらに自分の3Dモデルと合わせることでモニター越しでの共演が可能となりました。
そこそこローポリ(5,000Tri)で作りましたのでWebでの使用も可能です。
共演という夢を達成すると次は本人になりたいという欲が生まれました。
Oculus Touchには各種ボタンと近接センサーが仕込まれているので各指をある程度制御することが可能です。
先人にはUnityちゃんの指を動かしている方がいて、ご丁寧にスクリプトも公開されていたのでそれをお借りしました。
BLOG:Oculus TouchでUnityちゃんの指を動かして遊ぼう
指とは別に、Oculus Touchの動きと3Dモデルの腕をいい感じに連動させるには、アセットストアで販売されている[Final IK]に含まれるVRIKを利用すると容易に実現可能です。
#SOURCE OF IDEAS –part.2–
Oculus Touchのグリップ感は殴る系のゲームと相性が良いと考えており、UnrealEngine4(以下UE4)の練習がてら作ってみました。
UE4を学ぶにあたり、書籍:[Unreal Engine 4で極めるゲーム開発]を参考にしました。
UE4.13を使用しましたが、標準でVRテンプレートが用意されていたので、Oculus Touchとの連携は簡単でした。
基本的には書籍にかかれていた知識でまかなえましたが、Blenderで作成した3Dモデル(fbx)をUE4にimportするのにはすこしコツが必要で以下のYoutube動画をもとに3Dモデルを少し調整しています。
Make a Character in Blender For UE4 & Unity
#COMBINING IDEAS
- 理想の3Dキャラになりきる
- 襲い掛かってくる変態を殴り倒す
これらを合わせたものを作りたいと考え、Unityで作るかUE4で作るか検討しているとき、Unityのアセットストアで[夕陽さくらの部屋]の販売が開始されました。そう、例のカノジョの部屋です。
この瞬間、開発はUnityで行うことに決定しました。
アセットは昼間を想定されていましたが、欲しかったのは夜の状態だったので、[Post Processing Stack]というアセットを使いました。
Post Processing Stack -アセットストア
カラーグレーディング機能を用いて全体的に青みをかけ、机の表面など色の発光が強かったオブジェクトに関しては、マテリアルのEmission値を調整するだけで夜の雰囲気を作ることができました。
シチュエーションは夜ということもあり、今回ライトは一つも配置せずに背景オブジェクトはStaticとし、3Dキャラの陰影もすべてテクスチャにベイクしてあるだけとしました。これにより描画の負荷は結構低くなってると思うので敵キャラを大量に出してもカクつくことなく動作しています。(GPU:GTX1070マシンにて)
殴られた後の敵キャラの挙動についてはラグドールを設定し、通常モーションからラグドール状態へと切り替えることで、くたっとした動きを実現できます。(前述のUE4のDEMOでもそのような実装をしています)
Unity謹製のラグドールウィザードもあるのですが、イマイチ使い勝手がよくわからなかったので今回は[PuppetMaster]というアセットを購入しました。前述のFinal IKと同じ作者のアセットで、それぞれを併用することも可能ですが今回は特に併用する必要なかったのでしていません。
(プレイヤーにはFinal IK、敵キャラにはPuppetMasterを適用しています)
PuppetMasterはとても高機能で、DEMOに含まれるサンプルSceneを眺めてみるだけでもいろいろ想像力が膨らみます。
今回、敵キャラの行動パターンの制御についてはこのアセットに含まれていたAIのScriptを改造しています。
キャラのモーションもアセットに含まれているものをそのまま利用していますが、ジャンプモーションだけルパンダイブのポーズに変更しています。
ポーズデータを当てるだけでGUI上でモーフィング調整ができるのでUnityはホントに楽チンですね。
ジャンプの高さ、速度、移動量、正確さなど細かいパラメータ設定もGUI上で行うことが可能です。
今回各3Dキャラの目線は常にこちらを向くようにしていますが、これはモデリングだけ解決しています。黒目を奥行方向で奥側に配置することで視差が生じ、あたかも視線がこちらを追っているかのように見せることができます。Sketchfab上でカメラ目線となるキャラクターモデルがあったので、モデルデータをDLし中身を確認することでこの仕組みを理解することができました。
今回ユーザーがプレイヤーの顔を確認できるのは3D空間上の鏡を通したときだけなので、必ず目が合う状態となるはずです。
ですから、このように3Dモデルを作っておけばわざわざScript等で黒目を動かす必要もなくなり楽チンです。
合わせて敵キャラに関しても、「変態は常にこちらを凝視する」という想定が成り立つので同じようにモデリングしています。
左:黒目をまぶたより奥方向に配置したもの / 右:黒目をまぶた付近に配置したもの
#TRIAL & ERROR POINT
基本的にはアセットストアで購入したものの組み合わせで作られていますが、殴った時のヒット判定の実装に少し悩みました。
要件:殴ったときのみ打撃音を鳴らし、触っただけのときは音は鳴らさない
最終的にはOculus Touchの速度を取得できることを知ったので、敵キャラのCollisionの衝突時にTouch速度が一定の閾値を超えていたときだけ音を鳴らすということにしました。PuppetMasterの機能として独自のCollisionの衝突イベントが取得でき、その際に相対的な力も取得できるので、最初はその力をトリガーに音のON/OFFを行なとうしましたが、力は相対値のため敵キャラからぶつかってきた場合も値は大きくなり殴り判定としてしまい求めている要件には合いませんでした。
// ◆PuppetMasterの当たり判定イベントを利用したTouchの左右/グーパー判定(ざっくり抜粋) // MuscleCollision m にて、衝突対象を取得可能 // float impulse は衝突時の相対的な力 void OnCollisionImpulse(MuscleCollision m, float impulse) { foreach (ContactPoint contact in m.collision.contacts) { //puppetと衝突したColliderの名前で左右を判定 if (contact.otherCollider.name == "ORG-hand.L") { trigger = OVRInput.RawAxis1D.LHandTrigger; handVelocity = OVRInput.GetLocalControllerVelocity(OVRInput.Controller.LTouch); } else if (contact.otherCollider.name == "ORG-hand.R") { trigger = OVRInput.RawAxis1D.RHandTrigger; handVelocity = OVRInput.GetLocalControllerVelocity(OVRInput.Controller.RTouch); } //Touchの握り具合でグーパー判定 if (OVRInput.Get(trigger) > 0.7) { fingerType = FingerType.Goo; } else { fingerType = FingerType.Paa; } } }
#IMMERSION INTO VIRTUAL REALITY
衣装も用意しました。
イベントスタッフが着用することで体験者により高い没入感を与えることが可能です。
393
30歳で脱サラし、WEB制作を半年間学び、フリーのFLASHerとなる。
6年ほど活動した後、FLASH衰退のタイミングで再びサラリーマンに舞い戻る。
いまは主に社内風紀の改善に力を入れている。