oculus

大きさ基準が必要だ
大きさ基準が必要だ pmdの読み込み時スケーリングを実装した。 とりあえずドワーフと同じくらいの大きさになるように2.5倍という適当な数値を選択したが、 mmdモデルを一切スケーリングしない(Mikuが20高さ)か実世界のメートル/cm等の単位系になっているかのどちらかにしたい。 現状だと立った状態のカメラの高さが50くらいという謎の単位系であり、 Irrlichtのmediaディレクトリ内のファイル群と大きさがだいたい合うこと以外にメリットが無い。 Oculus使っているので実単位に合わせた方がよいな。cm単位系がよさげな気がする。 しかし、bullet的には9.8Gの方が98Gよりわかりやすような気がする。 bullet界はメートル系でレンダリングはcm系にするという手もあるがはまりそうではある。 シェーダーに梃入れしてもっとMMD風味のトゥーンレンダリングにしよう。

FPSカメラにOculus回転を仕込んだ
FPSカメラにOculus回転を仕込んだ IrrlichtのCSceneNodeAnimatorCameraFPSにOculusを合体した。 Irrlichtのカメラが思ったよりいろいろやっていたのと ビュー行列を直接扱っていないのに手間取ったがとりあえず当初の目的を達成。 どうにも都合が悪かったので本体をちょっと拡張した。 class CSCameraSceneNode { core::marix4 LeftAffector; }; レンダリング直前にビュー行列に乗算する行列をセットできるのだが これが右からの乗算なので、 左からの乗算を追加してこれにOculusの回転を表す行列をセットできるようにした。 これを踏まえてCSceneNodeAnimatorCameraFPSをコピーしてCSceneNodeAnimatorCameraOculusOnFPSを作った。 こいつはFPSカメラのマウスの上下移動を無視するのとlibOVRからの回転値取得と左行列を追加する機能をもつ。 コードはこれなのだけど https://github.com/ousttrue/onibi/blob/master/irrlicht/examples/HMDIrrlicht/CSceneNodeAnimatorCameraOculusOnFPS.cpp 日記に全部書くには長いし、サンプルが改造版のIrrlichtに依存するので紹介し辛い感じだなぁ。 オフスクリーンレンダリングとシェーダーをサポートした今風のglutみたいなフレームワークがあるとよいのだけど。 今度はmmd表示周りに着手して表示途中までできた。 しかしIrrlicht界のスケーリングの基準がよくわからず。cmのような気もするがなんかもっと適当な値のような気もする。 画像右側の身切れているのはIrrlichtサイズのDwarfである。 mmd界はミクさんの身長20を基準とする統一単位なのだが何かしら基準を決めねばならぬ。 物理の挙動の都合上スケーリングしたくないなーという事情がありどうしたものか。 スカイボックスもOculusで見ると見違えるものがあるなー。 テクスチャとライティングを解決する。 あとpmx。

Oculus来たー
Oculus来たー 6月10くらいにぽちってから2週間くらいで到着。いいタイミングに発注したらしい Oculusことはじめ oculus sdk downloadあたりで検索すると見つかるのでいただいてくる。 特にログインとかアカウントとかは必要ない。 SDKにはlibSDKとそれを使ったサンプルがvcプロジェクトで入っている。 oculusの組み込みには2段階あって、ひとつは両目向けに違うレンダリングをする作業、 2つめはOculusのジャイロセンサの値を受け取ってカメラの方向を対応させる作業となっている。 ひとつめのステレオレンダリングに関しては、左目用と右目用にオフスクリーンレンダリングして それを表示するときにシェーダーで歪ませるというものになる。 歪ませ方は、 RenderTiny_D3D1X_Device.cpp や Oculus_SDK_Overview.pdfに書いてある。 OpenCVとかのカメラ係数に似ているような気もするが同じものかは確認していない。 ふたつめの方は、LibOVRに任せると簡単でusbのHIDデバイスから値を随時取得して カメラ姿勢に適用するだけ。 LibOVRはこのジャイロの値取得とDXUT的な3Dフレームワークが混合しているので ジャイロの方だけを抽出して最小限にしたい。 あと自分のコードに混ぜて公開していいのかライセンス的によくわからん。 とりあえずglut化してみよう はじめに軽くTinyRoomをglutに移植しようと思ったらdxutみたいのがくっついていて途中で投げ出したw。 手持ちで、OpenGLシェーダーとかオフスクリーンレンダリングを扱うシステムが無いので そこから作るのが少し時間がかかるので後回しに。 IrrlichtのカメラをOculus化 方向転換して、ベースにlibOVRを合体した。 githubのものはoculusのステレオレンダリングは実装済みなのでgyroを合成する件のみ。 Irrlichtのカメラ行列の制御がよくわからぬが一応表示。 あとでICameraSceneNodeを継承して作り直そう。 mikuさんprprな感じになるにはもう少しかかるな・・・

IrrlichtにVRPNを合体する
IrrlichtにVRPNを合体する 遂にOculusが発送されたらしくHongKong Postから国内に入ったらしい。今日明日には来るで。 vrpnを仕込む Oculusが来たら遊ぶべくIrrlichにさらにvrpnを仕込むことにした。 外部入力はこれで一括して捌こうと構想している。 さしあたってはOculusの傾き情報(Quaternion)、マウス、コントローラの入力をvrpn経由にしようかと。 さらには、 Oculusは位置情報が無いのでKinectからスケルトン情報を受けて移動できるようにしたりWiiコン入力をとったりしたい。 WiiMote plusの内臓ジャイロの値を取れるソースも発見したのでキネクトで手の位置を取ってWiiコンの傾きと合体すればいい感じになるのではないかと妄想(hydraみたいに手が出てくるとこまでいけるのではないか)。 ゆくゆくはARToolKitやOpenCVのマーカー式やつもvrpn経由で合体しやすくなる。 <pre> oculus kinect wiimote A | | | rendering | | sensor | | | V | | irrlicht <-----+-----+ </pre> ということでvrpn作業開始。

Oculusぽちった
Oculusぽちった 会社で見せてもらったOculusに感銘を受けて本家サイトでぽちった。 8月発送の見通しとのことなのでそれまでに開発環境を用意しておかねば。 ということで、Irrlicht + Oculusという方向性で環境を整備することにしようかと思う。 Irrlichtに関しては数年前からちょくちょく触ってはいてgithubに残骸が残っている。 irrmmd(IrrlichtMMDメッシュ) onibi(Irrlichtと一緒に使いそうなライブラリの詰め合わせ) どっちが新しいのかよくわからないが、両方ともなんか中途半端な状態である。 しかし、mmdを表示できるようにしてbulletを仕込むという路線にするのでonibiの続きからやるのがよさそうだ。 まずはmmdがちゃんと動くところまで修復するとしようか。 あと別プロセスのGUI向けのバックドアとしてmsgpack-rpcを仕込む。 そんな感じにしよう。 onibiの方をvc2010でビルドしてみたところ少し手直ししたらビルドできた。そういえばirrlichtとbulletのpythonラッパーを作ろうとしておったことを思い出してきた。 まぁしかしそれはおいておくとする。 で、pmdモデルの読み込みサンプルがあるので実行してみたら完全に作業が途中らしくモーションがまったくおかしい。 さらにbulletのものと思われる開放漏れが報告される。前は、MinGWでやっていたので開放漏れに気付いていなかったか。 いろいろ手直しが必要そうだ。 mikuさん ついでなのでirrmmdの方もビルドしてみる。 こっちはちゃんと物理付でモーション再生に成功した。 irrmmdの方がちゃんとしているらしい。終了時にbulletを正しく開放しない問題はこちらも同じようだが。 onibiに合体して整理すれば使えそうだ。