2

サブウィンドウを使用して、カーブからオブジェクトを回転させて生成しようとしています。すべての曲線を生成できます。ウィンドウを 2 つの部分に分割しました。左のサブウィンドウに曲線を描き、右の軸に沿って回転させてソリッドを生成したいと考えています。右側のサブウィンドウに何も描画できません。

編集:

これが、左側の部分にドットを描いている方法です。ドットは基本的にユーザーによるクリックです。これらのイベントをキャプチャしてリストを作成し、for ループを使用してそれらを出力します。

// This function takes a list of points and draws the dots in the screen
void drawDot(vector<vec2> listPts)
{
    glBegin(GL_POINTS);
    glColor3f(1.0,1.0,1.0);

    if(j==0) // J=0 means points are being added using add option, no insert after is currently being used
    {
        for(int i=0;i<listPts.size();i++)
        {
            glVertex2i(listPts[i].x,listPts[i].y);
        }
    }
    else if(j!=0)// this else part is for making selected points look red, as for this j!=0 
    {
        for(int i=0;i<listPts.size();i++)
        {
            if(i==j ) // make only the selected point red
            {
                glColor3f(1.0,0.0,0.0);
                glVertex2i(listPts[i].x,listPts[i].y);
            }
            else // rest all the points are same as before i.e. white
            {
                glColor3f(1.0,1.0,1.0);
                glVertex2i(listPts[i].x,listPts[i].y);
            }
        }
    }

    glEnd();
    glFlush();
}

ここで、一連のポイントがあるとします。右のサブウィンドウに同じポイントを描画して、機能しているかどうかを確認したいだけです。それで、ボタンを作成しました。ボタンを押すたびに、右のウィンドウに切り替えて何かを描きたいと思います。私はVS2010でデバッグを使用し、描画機能がまったく呼び出されていて、それが呼び出されていても画面に何も表示されないことを確認しました。

これは、2 番目のウィンドウで描画するために使用している関数です。

void drawDotWin2(vector<vec2> listPts)
{
    glBegin(GL_POINTS);
    glColor3f(1.0,1.0,1.0);

    for(int i=0;i<listPts.size();i++)
        {
            glVertex2i(listPts[i].x,listPts[i].y);
        }
    glEnd();
    glutWireTeapot (0.5);
    glFlush();
}

ボタンを押すと。上記の関数が呼び出されますが、何も起こりません。座標系が間違っていますか? ただし、座標系を設定することはあまりしませんでした。

4

1 に答える 1

2

特にアプリケーションの実装で厳密に必要でない場合は、GLUT ユーティリティをできるだけ避けることをお勧めします。glutCreateSubWindowはその 1 つです。

ウィンドウを別々のセクションに分割する必要がある場合は、glViewportの使用方法を学んでください。

たとえば、メイン ウィンドウに 800x600 ピクセルのクライアント領域があり、ウィンドウを水平方向に分割したい場合、描画ルーチンは次のようになります。

void draw()
{
    // Draw on left side
    glViewport(0, 0, 400, 600);
    glClear(...);
    gluOrtho2D(0, 0, 400, 600);

    // ... DrawCommands1

    // Draw on left side
    glViewport(400, 0, 400, 600);
    glClear(...);
    gluOrtho2D(0, 0, 400, 600);

    // ... DrawCommands2
}

このように、2 つの図面は重なりません。両側に描画されたプリミティブは、メイン ウィンドウ クライアント領域に対するピクセル座標で定義された、定義済みのビューポート領域によってクリップされます。

射影行列 (上記の場合は 2D 直交) は、ウィンドウ領域ではなく、ビューポートに相対的です。実際、ビューポートの位置について心配する必要はありません。

また、各 GLUT サブウィンドウが OpenGL コンテキストを作成することにも注意してください。実際、各 GLUT サブウィンドウは独自の状態を保持し、状態の変更は他のウィンドウに影響を与えません。代わりに、私の回答では、2 つのルーチンはまったく同じ OpenGL コンテキストを共有しています。

于 2012-05-06T13:32:49.920 に答える