メカ徒然日記
とある工学屋のブログ.鳥人間とかプログラミングとか.
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


OculusRift+Unity失敗 解決事例 主にカメラ
本記事はOculus Rift Advent Calendar 2013 19日目
12/19担当記事として執筆しました。

[まえがき]
Oculus Rift,素晴らしいですね。ヘッドトラッキング付立体視HMDが3万円台
(為替レート・送料・税関代込)で手に入るなんていい世の中になりました。
さっそく飛びついたわけです.
僕はHPASimというフライトシムをC++で書いており、
これをOculusRiftでやりたいなぁ、と思い、ここ3か月ほどUnityに触っています。
なるほど。キャラクターを配置したり、簡単な物理を導入するの、早い!
Rigidbodyの追加されたキャラクターを置いて、跳ね回るキャラクタを眺め回すまでせいぜい1時間。
ああUnity素晴らしい。
MMD4Mecanimのおかげで、キャラクター出すのがボタン押すだけになってて、もうすごいんです。
これらをCで書くのって、結構つらい。


しかし簡単にゲーム作れるかというと、そうはいきませんでした。
というわけで本記事はプログラム書き始めて数年の趣味プログラマが、
OculusRift+Unityで引っかかったネタになります。

内容で、ほかの人とかぶったらごめんなさい。

[ひっかかりポイントと解決]
まず引っかかったのがカメラ。

①ミクさんに近づくと、消える
わーいみくさんだー、と近づくと・・・
見切れる_R
表示が…これでは至近距離に近づけない!
NearClip(ゲーム内で、これより近いところはうつさないよ、という距離設定)が原因だな、ということはわかったのですが
OVRCameraControllerのNearClip Plane値をいじっても、治りませんでした。
対処方法、詳しくは@CST_negi さんの記事を参照してください。
解決策:右カメラ/左カメラ[それぞれ]の設定を変える
僕はNearClip0.01~0.05くらいにしてます。


②.一人称視点カメラ
自分の分身としてキャラクターを用意すると、没入感が上がります。
キャラクターにカメラをくっつけて、
頭位置にカメラを移動すれば、一人称視点っぽくなるっだろう、とやってみると。。。
顔の中_R
周りを見回すと、顔の中が見える…こわい・・・
これはいわば、目玉(カメラ)だけが顔の中に浮いていて、
空の方向を向くので、頭蓋を見てしまっています。
また、キャラクターが座ったりするとカメラだけ宙に浮いてしまいます。

解決策:
つまり、キャラクターの目玉に当たる位置に、常にカメラがあればよいのです。
そのために、

A:カメラを、首を中心にオフセットをつけて回るようにする
B:カメラ(OculusRift)の回転に、キャラクター頭の回転を追従させる
の両方を実施します。


A:人間の頭の動きは、首を中心にオフセットがついて回っています。
目は、それに付随する形で動きます。OVRCameraControllerを、
キャラクタの、頭のJoint内に入れることで解決。凹みさんの記事①が詳しいですね。

追加としてカメラのポイントが目の位置にくるよう、オフセットとしてEyeCenterPositionをいじっています。
(Componentのtransrationをずらしてもいけます。)
カメラ設定_R
(もうちょっと目に近づけたいところですが、あまり近づけすぎると激しい動きをしたときに
また顔の中が見えます。カメラの姿勢更新に、キャラの頭姿勢更新が数フレーム追い付いてないようです。
なんで?)


B:凹みさんの記事②を参考にしました。
あちらでは「ミクさんの頭の向き」を「カメラに向けて」制御しているところを、
「自キャラの頭の姿勢」を「カメラの姿勢」で制御しています。
コードはこれを、自キャラにアタッチします。

using UnityEngine;
using System.Collections;

public class PilotBehaviourScript : MonoBehaviour {
private GameObject player_;
private GameObject head_; //pilot head
private GameObject camera_; //camera object

// Use this for initialization
void Start () {
//get Player Component
player_ = gameObject;

//get head component
head_ = gameObject.transform.FindChild("95.!Root/5.joint_HipMaster/10.joint_Torso/19.joint_Neck/20.joint_Head").gameObject;
Debug.Log (head_.name);

// Get main camera
camera_ = GameObject.FindWithTag("MainCamera");
Debug.Log (camera_.name);

}

// Update is called once per frame
void Update () {
Quaternion headRot = camera_.transform.rotation; //カメラの姿勢を、頭の姿勢に代入
head_.transform.rotation = headRot;
}
}

これで、頭の中が見えなくなりました。プレイビューで見ると、キャラの頭に合わせてカメラが回っていることが確認できました。凹みさん、ありがとうございます…!

③アニメーション
しかし、これにアニメーションをつけると、またキャラクタの頭が回らなくなりました。
アニメーションが、頭の姿勢を上書きしているようです。
凹みさんの記事のように、vmd書き出し時にMMDからの書き出しに頭は含めていないのですが、mecanimアニメーションの仕様か、mmd4mecanimの仕様か、アニメーションのない関節も0で上書きされるようです。

そのため、キャラクタに再生させるアニメーションで、首・頭の動きを再生させないようにマスクをかけます。
mask1_R.png
fbxファイルを選択、Animationタブから、マスクをかけたいアニメーション(今回はpilot001)を選択します。

mask2_R.png
下にスクロールしてMask->Transform ツリーを展開 (Definition:Create from This model )

mask3_R.png
下にスクロールして、neck_jointのチェックをクリックすると、neckジョイントの子ジョイントすべてのチェックが消えます。
チェックの消えた関節は「アニメーションで上書きしない」設定になります。


mask4_R.png
チェックを消したら、Applyボタンを押す。

これでようやく、アニメーション付きでも、頭を動かせるようになりました。
TwitterのUnity先達者の皆様、ご助言ありがとうございました。

④カメラの基本姿勢を、キャラクタに追従させる。
乗っている飛行機が回転したり、
FPSでキャラクターの向きをジョイパッドで変えた場合、
頭を動かさなくても、そちらの方向に向いてほしいですよね。
OVRCameraControllerをキャラクターのObject下に置いただけでは、これは実現されません。
装着者は真っ直ぐ座ったままで、飛行機が回転した場合、このような状態に…。
rotation2_5_R.png

OVRCameraControllerのFollowOrientation に、キャラクターのObjectを指定することで、
キャラクタの回転に合わせて、カメラも回るようになります。
rotation2_R.png



rotation3_R.png




ほかにもジョイパッドのアナログスティックで嵌ったこととか、
VR内でテレビを見るとかありますが、この辺で。
次のCalender担当は@n_yositaka さん、お願いいたします。

おまけ:
やってみたい だれかやってなネタ集:
a:スキージャンプ:スカイダイビングは遠景過ぎてスピード感・立体感が出にくいよね、
という話から派生。地表面近くを飛ぶスキージャンプならよいのでは?という話が出ました。

b:MikuMikuKotatsu:ミクさんとこたつで足がぶつかって、恥ずかしがる、そんなシチュエーション。
という発言にやられて製作開始。日本人の心の故郷、炬燵。こたつで初音ミクとVRまったり。
もうそこで世界終わるよね。
気が付いたらまた別のものが出来上がっていた…そのうち公開します。

c:HPASimForOculusRift:DXライブラリで製作中のゲーム、HPASimのOculus対応版。
特に鳥人間コンテストの飛び出しイメージをつかむとか、ついに500mを超えた滑空機
みたかもばらの視点・引き起こしタイミングのトレースとか、
突風後対応操作、操作インタフェースの配置検討など、
詰めていけば結構使えるんじゃないかな、と思っています。物理系を移植中。年内完成するとうれしい。


d:生体電位ネタ:筋肉のに力を入れるとエフェクトが光る、とか。
研究で筋電(生体電位)をやっていたので。低周波治療器のゲルパッド+計装アンプで作れます。
感電注意。電源は電池にしましょう。


本記事内で使用したモデルなどについて:

学ラン君 ver1.0a:作者 mato さま
Tda式初音ミク・アペンド:作者 Tdaさま
この作品はピアプロ・キャラクター・ライセンスに基づいてクリプトン・フューチャー・メディア株式会社のキャラクター「初音ミク」を描いたものです。
スポンサーサイト



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。