【问题标题】:Draw two crossed triangles in OpenGL在OpenGL中绘制两个交叉三角形
【发布时间】:2010-11-11 17:41:52
【问题描述】:

我正在 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 两个顶点一起使用,我只是无法弄清楚将这两个三角形组合在一起的旋转。

【问题讨论】:

    标签: java opengl processing vertex


    【解决方案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();
    

    如果这只是一个例子,那么这段代码应该没问题。但是,如果您要渲染多个这些,那么您将希望将四边形渲染代码存储到顶点缓冲区对象中,然后渲染多个顶点缓冲区对象。

    【讨论】:

    • 我会尝试更清楚一点:我只需要两个三角形,它们应该在中间交叉(就像这些旧的 3d 树木模型,很难解释)。他们应该一起旋转,我到目前为止,但不是交叉三角形本身。
    • 嗯,我有两个解决方案给你的树。我需要知道的是,您是指他们在游戏中使用的树木,其中叶子只有两个交叉的四边形,上面有纹理,或者您的意思是叶子的金字塔形顶部。否则我不确定你所说的两个交叉三角形是什么意思。也许你可以很快地用油漆模拟一些简单的东西。我保证我不会给你的程序员艺术评分。
    • 我指的是游戏中的树木,两个带纹理的四边形交叉。如果从按钮上看,它应该看起来像一个 +,从侧面看就像一个三角形。明天可以画点东西,但我想用+它会变得清楚吗?下次我就直接画了。
    【解决方案2】:

    我会分几个部分来回答你的问题。

    1) 这段代码将绘制一个矩形,但您提到了 2 个矩形和 2 个三角形,这让您尝试做的事情相当混乱。

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

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

    学习 OpenGL 的最佳资源之一是 NeHe 教程http://nehe.gamedev.net/ 这里应该有教程的 java 版本,否则不难理解。

    【讨论】:

    • 试图重新表述上述问题。感谢您的链接!
    【解决方案3】:

    感谢您的代码和纸上的一些几何图形,我终于找到了解决问题的方法:

    交叉三角形解:

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

    【讨论】:

      猜你喜欢
      • 2018-05-25
      • 1970-01-01
      • 2020-12-08
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      相关资源
      最近更新 更多