私は宇宙探査アプリケーションを書いています。単位は光年に決め、星間の距離を正確にモデル化しました。いじり回したり、多くの骨の折れる作業 (主にロープの学習) を行った後、宇宙を横断する宇宙船の視点からカメラが正しく機能するようになりました。
最初は、惑星オブジェクトに取り組むまで、gluPerspective () の zNear パラメーターに注意を払いませんでした。私の目盛りは光年単位なので、zNear が 1.0f であるため、そのような天体を見ることができないことにすぐに気付きました。実験の後、私はこれらの数字にたどり着きました:
#define POV 45
#define zNear 0.0000001f
#define zFar 100000000.0f
gluPerspective (POV, WinWidth/WinHeight, zNear ,zFar);
これは、太陽系 (位置 0,0,0) を巡航し、惑星の近くまで移動することができたという点で非常にうまく機能します。ただし、他のシステム (位置 0,0,0 ではない) は、オブジェクトが異常な方法でカメラから遠ざかるため、通過するのがはるかに困難でした。
しかし、宇宙をクルージングしているときに、奇妙な視覚的な不具合が発生し始めていることに気付きました。Y 方向に 180 度スイングすると、後ろのオブジェクトが「ラップアラウンド」して前方に表示され、元の場所にも表示されます。そのため、宇宙をワープするとき、ほとんどの星は正しく視差しますが、一部の星は現れて反対方向に移動します (控えめに言っても邪魔です)。
zNear を 0.1f に変更すると、これらのすべての不具合が即座に修正されます (ただし、太陽系のオブジェクトも解決されません)。だから私は立ち往生しています。また、glFrustum を使用してみましたが、まったく同じ結果が得られます。
私は以下を使用して世界を表示します。
glTranslatef(pos_x, pos_y, pos_z);
関連するカメラ コードを使用して、必要に応じて向きを合わせます。カメラ機能を無効にしても何も変わりません。gluLookAt() も試してみましたが、同じ結果が得られます。
極端な zNear / zFar 値が使用されている場合、gluPerspective() には制限がありますか? 射程距離を縮めようとしたが無駄だった。すべてを拡大し、より大きな zNear 値を使用することで、世界の単位を光年からキロメートルに変更しました。ヘルプ!