Нарисуйте два перекрещенных треугольника в OpenGL - PullRequest
0 голосов
/ 10 ноября 2010

Я делаю первые шаги с OpenGL на processing.org.Я хотел бы нарисовать два скрещенных треугольника, но на самом деле не понимаю, как повернуть треугольники, чтобы пересечь их.

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

Треугольники должны пересекаться, как эти старые трехмерные модели деревьев.Они должны вращаться и двигаться как один объект для последующего использования, который, как я полагал, работает с шипением и перемещением по обеим вершинам, я просто не могу понять вращение, чтобы соединить эти два треугольника.

Ответы [ 3 ]

1 голос
/ 10 ноября 2010

Если я правильно вас понимаю, вы пытаетесь вращать треугольники независимо друг от друга? В этом случае вам нужно будет использовать 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();

Если это только для примера, тогда этот код должен подойти. Однако, если вы собираетесь рендерить кратные из них, вы захотите сохранить код рендеринга с четырьмя точками в объекте буфера вершин, а затем отобразить несколько объектов буфера вершин.

0 голосов
/ 11 ноября 2010

Благодаря вашему коду и некоторой геометрии на бумаге, я наконец нашел решение (я) для моей задачи:

Решение в виде скрещенного треугольника:

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();
0 голосов
/ 10 ноября 2010

Я постараюсь ответить на ваш вопрос в нескольких частях.

1) Этот код нарисует один прямоугольник, но вы упомянули 2 прямоугольника и 2 треугольника, и это довольно запутанно, что вы пытаетесь сделать.

2) «Оба прямоугольника должны действовать позже как один объект». Это действительно невозможно через OpenGL. В opengl (по крайней мере на начальном уровне) все объекты создаются путем объединения отдельных команд. Таким образом, вы не говорите «здесь объект, а теперь нарисуйте его здесь, здесь и здесь». Вместо этого вы говорите: «Нарисуйте этот треугольник, теперь нарисуйте этот прямоугольник, теперь вращайте, теперь нарисуйте этот треугольник». Это пошаговый процесс.

OpenGL ничего не знает об объектах или моделях, вы должны определить это в своем коде, а затем сообщить OpenGL, как рисовать каждый объект.

Одним из лучших источников для изучения OpenGL являются учебники NeHe, найденные здесь http://nehe.gamedev.net/ У них должны быть java-версии учебников, в противном случае их нетрудно понять.

...