0

画面に 3D キューブを描画する基本的な opengl プロジェクトがあります。私の解像度は 1600 x 900 です。カメラが立方体からどれだけ離れていても、近付いていても、立方体は常に水平に引き伸ばされて三角形のように見えます。同じ立方体を Java プロジェクトにロードしたところ、完全に描画されました。しかし、C++ で同じコードを使用すると、引き伸ばされた効果が得られます。これを引き起こしている可能性のあるものについて何か提案はありますか?

GLvoid RenderSettings::init()
{
    const GLfloat FOV = 60.0F; 
    const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();
    const GLfloat NEAREST_VIEW = 1.0F;
    const GLfloat FARTHEST_VIEW = 1000.0F;

    glViewport(0, 0, getScreenWidth(), getScreenHeight());

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(FOV, ASPECT_RATIO, NEAREST_VIEW, FARTHEST_VIEW);

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LEQUAL);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}
4

1 に答える 1

1

これ

const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();

問題があります。整数を推定getScreenWidthして返します。getScreenHeightC/C++ では、整数を除算するとき、これは整数演算として発生します。つまり、結果は (常に) 次に小さい整数に丸められます。結果を割り当てるタイプは重要ではありません。C/C++ は、L 値と R 値の型を個別に調べます。分割の片側をフロートに型キャストすることで修正できます(通常は両方をキャストするだけです)。

GLfloat const ASPECT_RATIO = (float)getScreenWidth() / (float)getScreenHeight();

constまた、修飾子は連想のままであることに注意してください。つまり、修飾子の残りの部分に作用します。変数定義ステートメントの最初のトークンである場合にのみ、右方向に作用します。しかし、多くの言語純粋主義者 (私を含む) は、これを見苦しいと考えています。また、型の後に const を書くと、より自然言語に対応できます。

于 2013-04-07T11:47:15.087 に答える