1

gluLookAt の eyeZ 値に問題があります。

私が想像する方法は、カメラを遠くに移動して、視野内のオブジェクトを縮小するようなものです。

glDrawElements0、0、0 が宇宙の中心である 100x100x100 オルソを使用して、3D 空間で単純な形状を描画する単純なセットアップがあります。オブジェクトは 0, 0, 0 にあります。

マウスホイールをスクロールすると、オブジェクトが遠ざかったり近づいたりするようにしようとしています。これが glulookat の呼び出し方です。

float eyeX = 0;
float eyeY = 0;
float eyeZ = differenceInMouseWheel();

float centerX = 0;
float centerY = 0;
float centerZ = 0;

float upX = 0;
float upY = 1;
float upZ = 0;

gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);

ここで変わるのはeyeZだけです。

効果は奇妙です。約 10 秒間スクロールすると、オブジェクトの半分が突然消えます。そこからどんどん消えていきます。これはおそらく、カメラが 50 z の距離制限に向かっているためですが、オブジェクトが 3D 空間のようにスケーリングされない理由がわかりません。

センター値の仕組みを誤解しているのかもしれません。

私も適用しようとしdifferenceInMouseWheel()ましcenterZたが、それは何も変わりませんでした.中心値は、gluが方向を取得できるようにするためのものであり、それ以上のものではないと仮定します.

多分アップベクトルは変わるべきですか?現時点ではわかりません。

4

2 に答える 2

0

正投影法を使用しています。つまり、距離がどれほど離れていても、オブジェクトは常に同じサイズで表示されます。ただし、ファー クリッピング プレーンに到達すると、オブジェクトは消えます。これは、長時間スクロールしたときに表示されるものです。

2 つのオプションがあります。透視投影を使用するか、次のように正投影行列を変更してズームを実装します。

ズームを (0, 1] にし、viewport を現在のビューポートに設定された四角形にします。near をニア クリッピング プレーンの距離、far をファー クリッピング プレーンの距離とします。

glOrtho(zoom * viewport.width / 2, zoom * viewport.width / 2, zoom * viewport.height / 2, zoom * viewport.height / 2, near, far);
于 2012-04-24T08:20:19.347 に答える
0

透視投影行列を使用していますか、それとも正投​​影行列を使用していますか? 遠近マトリックスを使用しない場合、カメラを動かしてもオブジェクトのサイズが変化しないように見えます。

于 2012-04-23T15:59:45.873 に答える