0

processing.org で OpenGL の最初のステップを実行しています。交差する 2 つの三角形を描きたいのですが、三角形を回転させて交差させる方法がわかりません。

PGraphicsOpenGL pgl = (PGraphicsOpenGL) g;
GL gl = pgl.beginGL();

gl.glTranslatef(width/2, height/2, 0);
gl.glRotatef(a, 0, 0, 0);

gl.glBegin(GL.GL_TRIANGLES);
gl.glColor4f(0.7, 0.1, 0.7, 0.8);
gl.glVertex3f(0, 0, 0);
gl.glVertex3f(0, 50, 0);
gl.glVertex3f(25, 0, 25);
gl.glEnd();

gl.glRotatef(90, 1, 0, 0);
gl.glBegin(GL.GL_TRIANGLES);
gl.glColor4f(0.1, 0.9, 0.7, 0.8);
gl.glVertex3f(0, 0, 0);
gl.glVertex3f(0, 50, 0);
gl.glVertex3f(25, 0, 25);
gl.glEnd();

pgl.endGL();

三角形は、これらの古い木の 3D モデルのように交差する必要があります。それらは、後で使用する際に 1 つのオブジェクトとして回転および移動する必要があります。これは、両方の頂点のポップとプッシュで機能すると考えましたが、これら 2 つの三角形を一緒にするための回転がわかりません。

4

3 に答える 3

1

あなたが正しく理解している場合、三角形を互いに独立して回転させようとしていますか? その場合、三角形の前に gl.PushMatrix() を使用し、 gl.PopMatrix(); を使用する必要があります。トライアングルのその後。元:

gl.PushMatrix();
{
  gl.glTranslatef(width/2, height/2, 0); 
  gl.glRotatef(a, 0, 0, 0); 

  gl.glBegin(GL.GL_TRIANGLES); 
  gl.glColor4f(0.7, 0.1, 0.7, 0.8); 
  gl.glVertex3f(0, 0, 0); 
  gl.glVertex3f(0, 50, 0); 
  gl.glVertex3f(25, 0, 25); 
  gl.glEnd(); 
}
gl.PopMatrix();

gl.PushMatrix();
{
  gl.glRotatef(90, 1, 0, 0); 
  gl.glBegin(GL.GL_TRIANGLES); 
  gl.glColor4f(0.1, 0.9, 0.7, 0.8); 
  gl.glVertex3f(0, 0, 0); 
  gl.glVertex3f(0, 50, 0); 
  gl.glVertex3f(25, 0, 25); 
  gl.glEnd(); 
}
gl.PopMatrix();

そうしないと、上部の回転が両方の三角形に適用されます。

また、2 つの交差した「長方形」が必要だとおっしゃっていました。その場合、それぞれに 4 つの三角形または 1 つの四角形が必要になります。したがって、1 つのクワッド (長方形) は次のようになります。

gl.PushMatrix();
{

  gl.glTranslatef(width/2, height/2, 0);       
  gl.glRotatef(a, 0, 0, 0);       

  gl.glBegin(GL.GL_TRIANGLES);       
  gl.glColor4f(0.7, 0.1, 0.7, 0.8);       
  gl.glVertex3f(0, 0, 0);       
  gl.glVertex3f(0, 50, 0);       
  gl.glVertex3f(25, 0, 25);
  gl.glVertex3f(25, 0, 25);
  gl.glVertex3f(0, 50, 0);
  gl.glVertex3f(25, 50, 25);     
  gl.glEnd();

}
gl.PopMatrix();

またはさらに良い

gl.PushMatrix();
{    
  gl.glTranslatef(width/2, height/2, 0);       
  gl.glRotatef(a, 0, 0, 0);       

  gl.glBegin(GL.GL_QUADS);
  gl.glColor4f(0.7, 0.1, 0.7, 0.8);       
  gl.glVertex3f(0, 0, 0);       
  gl.glVertex3f(0, 50, 0); 
  gl.glVertex3f(25, 50, 25);      
  gl.glVertex3f(25, 0, 25);         
  gl.glEnd();      
}
gl.PopMatrix();

お役に立てれば。

ああ、今、私たちはどこかに到達しています!これはとても簡単です。回転に関する限り、それを回避して、四角形を互いに重ねて描画することができます。元の値 25 と 50 に基づいて、三角形を使用した例を次に示します。

gl.PushMatrix();
{
  gl.glBegin(GL.GL_TRIANGLES);       
  gl.glColor4f(0.7, 0.1, 0.7, 0.8);  

  gl.glVertex3f(-12.5, -25, -12.5);       
  gl.glVertex3f(-12.5, 25, -12.5);       
  gl.glVertex3f(12.5, -25, -12.5);
  gl.glVertex3f(12.5, -25, -12.5);
  gl.glVertex3f(-12.5, 25, -12.5);
  gl.glVertex3f(12.5, 25, -12.5); 

  gl.glVertex3f(0, -25, 0);       
  gl.glVertex3f(0, 25, 0);       
  gl.glVertex3f(0, -25, -25);
  gl.glVertex3f(0, -25, -25);
  gl.glVertex3f(0, 25, 0);
  gl.glVertex3f(0, 25, -25); 

  gl.glEnd();

}
gl.PopMatrix();

クワッドの例:

gl.PushMatrix();
{
  gl.glBegin(GL.GL_QUADS);
  gl.glColor4f(0.7, 0.1, 0.7, 0.8); 

  gl.glVertex3f(-12.5, -25, -12.5);       
  gl.glVertex3f(-12.5, 25, -12.5);  
  gl.glVertex3f(12.5, 25, -12.5);      
  gl.glVertex3f(12.5, -25, -12.5);


  gl.glVertex3f(0, -25, 0);       
  gl.glVertex3f(0, 25, 0);   
  gl.glVertex3f(0, 25, -25);      
  gl.glVertex3f(0, -25, -25);
  gl.glEnd();     
}
gl.PopMatrix();

これが単なる例である場合、このコードは問題ないはずです。ただし、これらの複数をレンダリングする場合は、クアッド レンダリング コードを頂点バッファー オブジェクトに格納してから、複数の頂点バッファー オブジェクトをレンダリングする必要があります。

于 2010-11-10T15:59:04.880 に答える
0

あなたの質問にいくつかの部分で答えようとします。

1) このコードは 1 つの四角形を描画しますが、2 つの四角形と 2 つの三角形について言及しており、何をしようとしているのかかなり混乱しています。

2)「両方の長方形は後で1つのオブジェクトとして機能する必要があります」。これは実際には OpenGL では不可能です。OpenGL (少なくとも初心者レベル) では、単一のコマンドを連鎖させることでオブジェクト全体が作成されます。ですから、「ここにオブジェクトがあるから、ここ、ここ、ここに描いてください」とは言いません。代わりに、「この三角形を描いて、この長方形を描いて、今度は回転させて、この三角形を描いて」と言います。それは段階的なプロセスです。

OpenGL はオブジェクトやモデルについて何も知りません。それをコードで定義し、OpenGL に各オブジェクトの描画方法を指示するのはあなた次第です。

OpenGL を学習するための最良のソースの 1 つは、ここにある NeHe チュートリアルですhttp://nehe.gamedev.net/チュートリアルの Java バージョンが必要です。

于 2010-11-10T15:59:15.570 に答える
0

あなたのコードと紙の上のいくつかのジオメトリのおかげで、私は最終的に私の問題の解決策を見つけました:

交差三角形の解:

gl.glBegin(GL.GL_TRIANGLES);
  gl.glColor4f(0.1, 0.9, 0.7, 0.8);
  gl.glVertex3f(-25, 0, 0);    // lower left vertex
  gl.glVertex3f( 25, 0, 0);    // lower right vertex
  gl.glVertex3f( 0,  50, 0);    // upper vertex
gl.glEnd();

gl.glBegin(GL.GL_TRIANGLES);
  gl.glColor4f(0.9, 0.1, 0.7, 0.8);
  gl.glVertex3f(0, 0, 25);    // lower left vertex
  gl.glVertex3f( 0, 0, -25);    // lower right vertex
  gl.glVertex3f( 0,  50, 0);    // upper vertex
gl.glEnd();

または、4 つの三角形でも同じです。

gl.glBegin(GL.GL_TRIANGLES);
  gl.glColor4f(0.7, 0.1, 0.7, 0.8);
  gl.glVertex3f(0, 0, 0);
  gl.glVertex3f(0, 50, 0);
  gl.glVertex3f(25, 0, 25);
gl.glEnd();

gl.glBegin(GL.GL_TRIANGLES);
  gl.glColor4f(0.1, 0.9, 0.7, 0.8);
  gl.glVertex3f(0, 0, 0);
  gl.glVertex3f(-25, 0, -25);
  gl.glVertex3f(0, 50, 0);
gl.glEnd();

gl.glBegin(GL.GL_TRIANGLES);
  gl.glColor4f(0.1, 0.1, 0.9, 0.8);
  gl.glVertex3f(0, 0, 0);
  gl.glVertex3f(25, 0, -25);
  gl.glVertex3f(0, 50, 0);
gl.glEnd();

gl.glBegin(GL.GL_TRIANGLES);
  gl.glColor4f(0.1, 0.9, 0.7, 0.8);
  gl.glVertex3f(0, 0, 0);
  gl.glVertex3f(-25, 0, 25);
  gl.glVertex3f(0, 50, 0);
gl.glEnd();
于 2010-11-11T09:41:52.997 に答える