0

我正在 processing.org 中使用 OpenGL 做我的第一步。我想画两个交叉的三角形,但不知道如何旋转三角形来交叉它们。

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 树木模型一样交叉。它们应该在以后使用时作为一个对象旋转和移动,我认为它可以与 pop 和 push 两个顶点一起使用,我只是无法弄清楚将这两个三角形组合在一起的旋转。

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();

否则,顶部旋转将应用于两个三角形。

另外,我注意到你说你需要两个交叉的“矩形”。如果是这种情况,您将需要 4 个三角形或一个四边形。所以一个四边形,矩形,将是:

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)这段代码将绘制一个矩形,但您提到了 2 个矩形和 2 个三角形,这让您尝试做的事情相当混乱。

2)“两个矩形以后都应该作为一个对象”。这真的不可能通过 OpenGL 实现。在 opengl 中(至少在初学者级别),整个对象是通过将单个命令链接在一起来创建的。所以你不会说“这是一个物体,现在在这里,这里和这里画它”。相反,你说“画这个三角形,现在画这个矩形,现在旋转,现在画这个三角形”。这是一个循序渐进的过程。

OpenGL 对对象或模型一无所知,由您在代码中定义,然后告诉 OpenGL 如何绘制每个对象。

学习 OpenGL 的最佳资源之一是 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();

或与四个三角形相同:

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 回答