視点変更する実験
使用バージョン1.18.1.2
レンダリング時に使う視点はグローバル変数LLViewCamera *gCameraに保存されているようなので、メインループ内でgCameraを変更してみる。このゲームのメインループはviewer.cppのmain_loop()内、while(!gQuit)から。
メインループ。結構短い。
gKeyboard->scanKeyboard(); LLViewerJoystick::scanJoystick();
して、
idle(); LLCurl::process(); gServicePump->pump(); gServicePump->callback();
して、
display();
して、ワーカースレッドを動かしたり止めたりして1ループ終了。
EStartupState gStartupState@viewer.cpp。EStartupStateの定義を見れば想像がつくように、初期化の進行状況を示しているらしい。STATE_STARTEDがふつうの状態、それ以外はなんらかの特殊な処理中。
で。とりあえずループ内でgCameraを変更して挙動を観察してみる。
// Render scene. if (!gQuit) { if(gStartupState == STATE_STARTED) { gCamera->roll(0.1); } display();
これでぐるぐる回るかと思ったら何も起こらなかった。
仮説:gCameraはレンダリングルーチンにカメラデータ渡すための媒介変数で、毎フレーム初期化される。
実験:rollの数値をもっと大きくしてみて、gCameraによって視点がほんとうに変化しているのかチェック。
gCamera->roll(2.0) → かたむいたよ!!!
ただしここでgCameraを変更することは、正しくない、気がする。視点情報はレンダリングだけでなく、サーバからデータを取ってくる際にも必要だ。視界に入ってる範囲のモデルデータだけを取ってくるようにしてあるはず。
そこで、視点を後ろ向きに設定して何が起こるか見てみよう。gCamera->yaw(1.57)っと。
360°==π[rad]だと思い込んでいた。死にたい。あとrollとpitchとyawの定義をいつも忘れる。
カメラ後ろ向きで実行。視点を変えると、その方角のオブジェクトがロードされる様がよくわかる。つまりこの場所でのカメラへの操作は通信フェーズに影響を及ぼすと……。オブジェクトのロードがどのタイミングで行なわれているのかよくわからない。このあたりの流れ、いずれ調査する必要があるかもだ。
さてさて、視点のコントロールはできるようになった。次にやることは、外部入力。プロセス間通信的な物を使って、他のプログラムから視点をコントロールできるようにしたい。何を使うのがいいだろうか……。