我正在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一起工作并推动两个顶点,我只是无法弄清楚旋转以将这两个三角形组合在一起。
答案 0 :(得分:1)
如果我理解你正确,你试图独立旋转三角形?在这种情况下,您需要在三角形和gl.PopMatrix()之前使用gl.PushMatrix();在三角形之后。例如:
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个三角形或一个四边形。所以一个Quad,矩形,将是:
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();
Quads示例:
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();
如果这只是一个例子,那么这段代码应该没问题。但是,如果您要渲染多个这些,那么您将要将四重渲染代码存储到顶点缓冲区对象中,然后渲染多个顶点缓冲区对象。
答案 1 :(得分:0)
我会尝试分几部分回答你的问题。
1)此代码将绘制一个矩形,但是你提到了2个矩形和2个三角形,这让你想要做的事情相当混乱。
2)“两个矩形后来应该作为一个对象”。这真的是不可能通过OpenGL。在opengl中(至少在初学者级别),通过将单个命令链接在一起来创建整个对象。所以你不要说“这里是一个对象,现在在这里,这里和这里画”。相反,你说“画这个三角形,现在绘制这个矩形,现在旋转,现在绘制这个triangel”。这是一个循序渐进的过程。
OpenGL对对象或模型一无所知,您可以在代码中定义它,然后告诉OpenGL如何绘制每个对象。
学习OpenGL的最佳来源之一是这里的NeHe教程http://nehe.gamedev.net/他们应该有java版本的教程,否则不难理解。
答案 2 :(得分: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();