視点変更する実験

使用バージョン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の定義をいつも忘れる。

カメラ後ろ向きで実行。視点を変えると、その方角のオブジェクトがロードされる様がよくわかる。つまりこの場所でのカメラへの操作は通信フェーズに影響を及ぼすと……。オブジェクトのロードがどのタイミングで行なわれているのかよくわからない。このあたりの流れ、いずれ調査する必要があるかもだ。

さてさて、視点のコントロールはできるようになった。次にやることは、外部入力。プロセス間通信的な物を使って、他のプログラムから視点をコントロールできるようにしたい。何を使うのがいいだろうか……。