2011-06-16 10 views
0

私はglViewportに問題があります。私のliitleのプログラムでは、私は2つのビューポートを持っています。これらのビューポートの1つにフォーム(モーションファンクション付き)を描画し、もう1つはラインが自動的に描画されます。 これまでのところとても良い.. mousefuncで何かを描画しようとすると、ビューポートは全く別の場所にあります。そして、そのビューポートに新しい正しい座標を見つけることは非常に困難です。 座標をリセットする可能性はありますか? マウスまたはモーションでglLoadIdentityを使用することはできません。何も表示されないためです。OpenGL glViewport()(座標をリセットする)

私はあなたが何を意味するのか理解していただければ幸いです。説明するのは少し難しいです。

ここでOK codesnippet ....

void mouse (int button, int state, int mx, int my) 
{ 
if (modus == 0 && button==GLUT_LEFT_BUTTON && state != GLUT_DOWN) 
{ 
    ... 
} 

else if (modus == 1 && button==GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
{ 


    **glViewport(10,10 , sw_w1, sw_h1);** 
//the drawing is much higher than in the first viewport in motion. 
//But it should be the same viewport like the first in motion. 
    glBegin()...glEnd() 
      glFlush(); 
} 
} 
void motion(int mousex,int mousey) 
{ 
GLdouble h=12; 
GLdouble winkel=360/h; 
Line liste[num]; 

liste[++last].x =(mousex)-((sw_w1+2*GAP)/2); 
liste[last].y =(mousey)-((sw_h1+2*GAP)/2); 

if (modus==0 && gruppe == 0) { 
    if (last>=1) 
    { 
     glViewport(10, 10, sw_w1, sw_h1); //works fine 
     glColor3d(R, G, B); 
     for(h+1;h>0;h--){ 
      glRotated(winkel, 0, 0, 1); 
      glBegin(GL_LINE_STRIP); 
      for(int i=last-1;i<=last;i++){ 
       glVertex2i(liste[i].x,liste[i].y); 
      } 
      glEnd(); 
     } 

     glLineWidth(linewidth+0.5); 
     glColor3f(1, 0, 0); 
     glBegin(GL_LINE_STRIP); 
     for(int i=last-1;i<=last;i++){ 
      glVertex2i(liste[i].x,liste[i].y); 
     } 
     glEnd(); 
     glViewport(1020,10 , sw_w2, sw_h2); //works fine 
     glColor3f(1, 0, 0); 
     glBegin(GL_LINE_STRIP); 
     for(int i=last-1;i<=last;i++){ 
      glVertex2i(liste[i].x,liste[i].y); 
     } 
     glEnd(); 
    } 
    glFlush(); 

} 
} 

第二と第三ビューポートが正常に動作します。最初のものは2番目のものと同じですが、画像ははるかに高く表示されます。なぜそうですか? そして、私はそれを変更して、2番目のビューポートと同じビューポートを得ることができます。 私はあなたが今何を意味するのか理解してくれることを願っています。

+5

私は –

+0

を理解していませんおそらく、あなたの訴えがそれほどうまく説明的ではないので、あなたがしたいことを明確にするためのコードを投稿するべきでしょう。 –

+0

上に私の質問に私の変更が表示されます。 – buddy

答えて

1

モデルビュー/投影行列をチェックして、それぞれの機能に期待するものであるかどうかを確認する必要があります。

クリスチャンがコメントしたように、モーション・ファンクを描画する必要はありませんし、推奨しません。入力ごとにアプリケーションの状態を更新し、glutPostRedisplayを呼び出して、ウィンドウを再描画することを知らせます。そうすれば、アプリケーションのデザインがよりクリーンになり、一貫して動作させるのがより簡単になります。

(それが問題だったので答えとして私のコメントを追加しました、そしてそれは適切な解決策であることから、クリスチャンのコメントを追加しました。はmotionfuncに描画しないでください!。)

+0

motionfuncを描画するのはなぜ問題ですか?私はあなたが意味することを理解していません: "あなたのアプリケーションの状態を入力ごとに更新する" mousefuncを描画することはできますか?私がglutdisplayfuncでglutPostRedisplayを呼び出すとき、何ももう機能しません。だから私はどこで代わりに描くことができます。 – buddy

+0

@buddy:mousefuncからの入力を他の変数に保存/使用する必要があります(ゲームを書く場合は、あなたの船が進んでいるところの更新など)、motionfuncからglutPostRedisplay()を呼び出してください。 keyboardfunc、menufuncなどと同様です。glutpostredisplayを呼び出すと、すべてのイベントが処理されるとすぐにglutdisplayfuncを呼び出すようGLUTに指示します。 (したがって、すべての描画がdisplayfuncに移行します)。そのパターンに従うことは事実上のイベント/再描画の方法であり、特にマウスイベントが多く、低フレームレートで実行しているような問題を回避します。 – Macke

関連する問題