基本的に、ビューポート/ウィンドウのサイズが変更されたときに、レンダリングされたイメージの歪みやストレッチを削除する方法を知りたいです。
次の画像は、私が話している歪み/伸縮の例です。
元の画像(正方形ウィンドウ)
歪んだ/引き伸ばされた画像(長方形のウィンドウ)
理想的には、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)
そして、私の期待は正しかったので、比例の問題は解決しました。ただし、希望する結果が得られません。ウィンドウの幅が大きくなると、レンダリングされるイメージは小さくなります(ただし、球体は実際には円形です)。代わりに、球体のサイズをまったく変更しないでください。表示されるシーンの量のみを変更する必要があります。