Pregunta

Estoy haciendo mis primeros pasos con OpenGL en processing.org. Me gustaría dibujar dos triángulos cruzados, pero realmente no entiendo cómo rotar los triángulos para cruzarlas.

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

Los triángulos deben ser cruzadas como estos viejos modelos 3D de los árboles. Ellos deben girar y moverse como un objeto en su uso posterior, lo que me imaginé trabajos con el pop y empujar alrededor de los dos vértices, simplemente no puedo averiguar la rotación para conseguir estos dos triángulos juntos.

¿Fue útil?

Solución 3

Gracias a su código y un poco de geometría en el papel, que finalmente encontró la solución (s) para mi problema:

solución de triángulo cruzadas:

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

O lo mismo con cuatro triángulos:

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

Otros consejos

Si he entendido bien que está tratando de hacer girar los triángulos de forma independiente unos de otros? En ese caso, tendría que usar gl.PushMatrix () antes de que el triángulo y gl.PopMatrix (); después del triángulo. Ej:

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

de otra forma la rotación superior se aplicará tanto a los triángulos.

Además, me di usted ha dicho que necesita dos "rectángulos" cruzados. Si ese es el caso, tendrá 4 triángulos o un quad para cada uno. Así que un Quad, rectángulo, sería la siguiente:

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

o incluso mejor

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

Espero que esto ayude.

Ahh, ahora estamos llegando a alguna parte! Muy bien, este es de forma sencilla. En cuanto a la rotación va usted puede evitar que e ir directamente a la elaboración de los quads en la parte superior de uno al otro. Yendo en base a sus valores originales de 25 y 50 Este es un ejemplo con triángulos:

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

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

Si esto es sólo un ejemplo, este código debe estar bien. Sin embargo, si vas a ser renderizado múltiplos de éstos, entonces van a querer almacenar el código de cuatro render en un objeto de búfer de vértices y luego procesar varios de los objetos de búfer de vértices.

Voy a tratar de responder a su pregunta en varias piezas.

1) Este código dibuja un rectángulo único, pero que mencionar 2 rectángulo y 2 triángulos y es bastante confuso lo que está tratando de hacer.

2) "Ambos rectángulos debe actuar como un objeto más tarde". Esto realmente no es posible a través de OpenGL. En OpenGL (al menos en los niveles de principiante), objetos enteros son creados por encadenar comandos individuales. Por lo que no dice "aquí es un objeto, ahora dibujar aquí, aquí y aquí". En lugar de decir "sacar este triángulo, ahora dibujar este rectángulo, ahora rotar, ahora sacar esta triangel". Es un proceso paso a paso.

OpenGL no sabe nada acerca de objetos o modelos, le toca a usted para definir que en su código, a continuación, diga OpenGL cómo dibujar cada objeto.

Una de las mejores fuentes para el aprendizaje de OpenGL es los tutoriales NeHe encontrar aquí http://nehe.gamedev.net/ deben tener las versiones de Java de los tutoriales, de lo contrario no es difícil de entender.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top