2012-05-06 32 views
2

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

編集:

これは私が左の部分に点を描画する方法です。ドットは、基本的にユーザーによるクリックです。これらのイベントをキャプチャしてリストを作成し、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でデバッグを使用し、図面funcが呼び出されていて呼び出されていて何も画面に表示されていないことを確認しました。

これは、第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(); 
} 

ボタンを押したとき。上記の関数は呼び出されますが、何も起こりません。私の調整システムは間違っていますか?私は座標系を設定するために多くをしなかった。

+0

一部のソースコードは役に立ちます –

+0

こんにちは、私は私の投稿を編集し、いくつかのコードの断片を追加しました。助けてくれることを願っています。 – mindbender

+0

"サブウィンドウ"を定義してください。 – Luca

答えて

2

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

ウィンドウを分割する必要がある場合は、glViewportの使い方を学んでください。例えば

メインウィンドウには、800×600ピクセルのクライアント領域を持っており、私はウィンドウを水平方向に分割したい場合は、描画ルーチンは次のようになります。

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枚の図面はありません重複しない。各側面に描画されたプリミティブは、定義されたビューポート領域によってクリップされ、メインウィンドウのクライアント領域に対するピクセル座標で定義されます。

投影行列(上記の場合は2次元直交)は、ウィンドウ領域ではなく、ビューポートに関連しています。実際には、ビューポートの位置を気にする必要はありません。

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

+0

返信いただきありがとうございます。ルカ私は間違いなくこの状況を処理するためにビューポートを使用し、それがどのように進むのかを教えてください。返信ありがとう! 乾杯! – mindbender

関連する問題