代码之家  ›  专栏  ›  技术社区  ›  Patrick

在OpenGL中绘制两个交叉三角形

  •  0
  • Patrick  · 技术社区  · 15 年前

    我正在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();
    

    三角形应该像这些旧的树木三维模型那样交叉。在以后的使用中,它们应该作为一个对象旋转和移动,我认为这与pop和push在两个顶点上都有效,我只是无法计算出旋转来将这两个三角形组合在一起。

    3 回复  |  直到 15 年前
        1
  •  1
  •   lrussell851    15 年前

    如果我理解正确的话,你是在试图独立地旋转三角形吗?在这种情况下,您需要在三角形之前使用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();
    

    如果这只是一个例子,那么这个代码应该是好的。但是,如果要渲染这些对象的倍数,则需要将四元渲染代码存储到顶点缓冲区对象中,然后渲染多个顶点缓冲区对象。

        2
  •  0
  •   Timothy Baldridge    15 年前

    我将试着分几个部分回答你的问题。

    1)这段代码将绘制一个矩形,但是您提到了2个矩形和2个三角形,这会让您很困惑。

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

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

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

        3
  •  0
  •   Patrick    15 年前

    多亏了你的代码和纸上的一些几何图形,我终于找到了我的问题的解决方案:

    交叉三角形解决方案:

    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();
    
    推荐文章