質問
単純な2D OpenGLアプリケーションを作成していますが、カメラの問題が発生しているようです。 (20,20)で長方形を描くと、(25,20)くらいで描かれます。 (100、20)で描くと、125かそこらで描かれます。何らかの理由で、すべてが右に数%シフトされています。
ここにトリミングバージョンを貼り付けました http://pastebin.com/m56491c4c
GLUTの設定方法に何か問題がありますか?オブジェクトを無効にすると同じことが起こるため、オブジェクトがおかしなことをしているのではないことを知っています。
事前に感謝します。
解決
reshape関数( resize()
)内に射影行列を設定する必要があります。これにより、ユーザーがウィンドウのサイズを変更する問題も自動的に解決されます。
void resize(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, w, h, 0);
}
そして描画関数で、マトリックスモードがモデルビューであることを確認します:
void draw()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
...
}
コードに関するその他の問題:
- おそらく、
draw()
の最後にglutPostRedisplay()
を呼び出すべきではありません。これにより、CPUが100%で実行されます。代わりにglutTimerFunc()
を使用して、数ミリ秒ごとに更新を行うことができます。 -
processMouse()
では、char
sの配列でwsprintf()
を使用しています:wsprintf()
はワイド文字の配列(wchar_t
)を取るため、タイプwchar_t []
のローカル変数s
を作成するか、wsprintf()
およびMessageBoxW()
の代わりにsprintf()
およびMessageBoxA()
(MessageBox()
は、Unicodeアプリケーションをコンパイルするときにマクロとして展開されます。また、バッファオーバーフローに対して脆弱です。実際には、非常に大きなx
値が渡されることはありませんが、少なくとも12文字のバッファを使用する必要があります。最後に、sprintf()/ wsprintf()
の代わりにsnprintf()/ wsnprintf()
も使用して、バッファオーバーフローから保護する必要があります。
他のヒント
ModelViewマトリックスでglOrtho2Dを呼び出しているようです。それが問題だとは思いませんが(この場合はProjectionがIDであるはずです)、代わりにProjectionマトリックスで呼び出す必要があります。
また、サイズ変更の呼び出しでwとhを印刷する必要があります。これは、ウィンドウサイズが実際に思っているとおりであることを確認するためです(glutがどのように機能するかはわかりませんが、glutInitWindowSize()は混乱させるでしょう)。
作業しているシステムによって異なりますが、通常、ほとんどのウィンドウ座標系は左下隅から始まり、右上にカウントされます。この場合、gluOrth02D呼び出しは間違っています。
あなたが持っている:
gluOrtho2D(0, appWidth, appHeight, 0);
ウィンドウの上部が下部にマッピングされ、逆も同様です。
ほとんどの場合:
gluOrtho2D(0, appWidth, 0, appHeight);
先ほど言ったように、それはシステム、プラットフォームの種類によって異なります。 ほとんどのLinux実装についてのみ話すことができます。
バグに影響する場合に備えて、他に何かチェックしてください。