ビューポートの伸縮を防ぐにはどうすればよいですか?


13

基本的に、ビューポート/ウィンドウのサイズが変更されたときに、レンダリングされたイメージの歪みやストレッチを削除する方法を知りたいです。

次の画像は、私が話している歪み/伸縮の例です。

元の画像(正方形ウィンドウ)

歪みなし

歪んだ/引き伸ばされた画像(長方形のウィンドウ)

歪みあり

理想的には、2番目の画像は水平方向に引き伸ばさずに球体を表示し、より大きなウィンドウサイズを考慮してより多くのシーンをユーザーに公開する必要があります。

これをどのように行うことができますか?

私はOpenGLと連携して画像をレンダリングし、呼び出しを介して透視投影を利用しています。

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

アスペクト比width/heightは、私が出くわしたすべての文書/チュートリアルに従っているので、間違っているとは思わない。しかし、私の疑いは、ストレッチングの問題に影響しているということです。


結果論

正直に言って、この問題についてもっと考えてみると、解答には、フォービィ(y方向の視野)角度とアスペクト比との正比例関係が関係していると信じられていました。

透視投影

上記の画像を参照として使用すると、幅が拡大する場合(水平方向のストレッチが発生する場合)、レンダリングされた画像の比例性を「固定」する垂直方向のストレッチを引き起こすためにfovy角度を大きくする必要がありそうです。

同様に、幅を小さくするには、フォビ角を小さくする必要があります。

更新:

したがって、これをさらに調査した後、次のように視錐台の設定方法を変更することにしました。

gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)

そして、私の期待は正しかったので、比例の問題は解決しました。ただし、希望する結果が得られません。ウィンドウの幅が大きくなると、レンダリングされるイメージは小さくなります(ただし、球体は実際には円形です)。代わりに、球体のサイズをまったく変更しないでください。表示されるシーンの量のみを変更する必要があります。

回答:


14

実際、元の質問はソリューションから1キャスト離れています。

元のコード

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

固定コード

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, (float)window.width/window.height, 0.01f, 100.0f)

問題はあったwindow.widthwindow.heightアスペクト比は、整数除算の結果であることに起因整数です。

ディメンションの1つをfloatにキャストすると、代わりに浮動小数点除算が使用されます。

アスペクト比が正しくなったため、元の投稿に見られるようなストレッチはなくなりました。

編集:元の投稿(および回答)のコードは、GPU呼び出しの単なる擬似コードです。上記の画像の出力に使用される実際のプログラムはJavaで記述されています。Javaを使用していない人には、整数/浮動小数点除算が同じ方法で実装されているかどうかを調べるために調査していません。とにかく、解決策はアスペクト比が実際に正しく計算されることを確認することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.