0

Qt と OpenGL (具体的には QGLWidget) を使用して、C++ でビリヤード ゲームをプログラミングしています。私は OpenGL の使い方をある程度知っていますが、あまり専門的ではありません。

私がやったこと:Qtウィジェット(ボタンなど)とQGLWidget(私自身の実装)を含むQtアプリウィンドウを作成します。

問題: このウィンドウにボールを描画して回転させることはできますが、ビューの縦横比が正しくありません + スペース全体を使用できないようです。

アスペクト比が間違っている 白い四角形は競技場です (寸法: float 座標で 1.4 x 2.7)

モデルを変換できますが、途切れているようです: モデルカットオフ

ビューを変換するとすぐに (関数については以下を確認してください)、モデルの一部が切り取られたように見えます。

これは長方形です (ボールはこれらの座標内で正しく描画されます):

glBegin(GL_LINE_LOOP);
    glColor3f(255.0, 255.0, 255.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(1.4, 0.0, 0.0);

    glVertex3f(1.4, 0.0, 0.0);
    glVertex3f(1.4, 2.7, 0.0);

    glVertex3f(1.4, 2.7, 0.0);
    glVertex3f(0.0, 2.7, 0.0);

    glVertex3f(0.0, 2.7, 0.0);
    glVertex3f(0.0, 0.0, 0.0);
glEnd();

OpenGL のサイズ変更機能:

void GLWidget::resizeGL( int width, int height )
{
    int side = qMin( width, height );
    glViewport( (width - side) / 2, (height - side) / 2, side, side );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( -0.05, +1.45, -0.05, +2.75, 0.0, 50.0 );
    //glFrustum( -0.05, +1.45, 0.0, 0.0, 0.0, 50.0 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();                                                     
}

そして最後に、ビューに関連するレンダー関数の一部:

 gluLookAt(0.0, 0.0, 1.0, 0.0, -0.70, 0.0, 0.0, 1.0, 0.0 ); // This is the cut of part
 //gluLookAt(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); // Normal but weird rectangle
 glScalef( 1.0, 1.0, 1.0);
4

1 に答える 1

1

あなたの問題はここにあります:

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -0.05, +1.45, -0.05, +2.75, 0.0, 50.0 );

投影の左/右または上/下の制限は、ビューポートのアスペクトと一致する必要があります。これらのハードコードされた値は、ウィンドウ ジオメトリの変更に適応しません。

また、ニア プレーンとファー プレーンが可視シーン範囲に割り込まないようにしてください。

于 2012-06-04T12:31:31.173 に答える