2010-11-10 2 views
0

Я делаю первые шаги с OpenGL на process.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-модели деревьев. Они должны вращаться и перемещаться как один объект в последующем использовании, и я решил, что работает с попсом и нажимаю на обе вершины, я просто не могу понять вращение, чтобы объединить эти два треугольника.

ответ

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

другой мудрый верхний поворот будет применен к обоим треугольникам.

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

Надеется, что это помогает.

Ahh, теперь мы куда-то попадаем! Хорошо, это просто. Что касается вращения, вы можете избежать этого и перейти непосредственно к рисованию квадроциклов друг над другом. Отправляясь на основе ваших исходных значений 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(); 

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

+0

Я постараюсь быть более ясным: мне просто нужно два треугольника, которые должны быть скрещены в середине (как эти старые 3d модели деревьев, это» трудно объяснить). Они должны вращаться вместе, которые я получил до сих пор, но не сами скрещенные треугольники. – Patrick

+0

Ну, у меня есть два решения для дерева. Мне нужно знать, если вы имеете в виду деревья, которые они использовали в играх, где листья, где только два скрещенных квадроцикла с текстурой на них, или если вы имеете в виду пирамидальную форму для листьев. В противном случае я не уверен, что вы подразумеваете под двумя скрещенными треугольниками. Может быть, вы могли бы посмеяться над чем-то простым в краске. Я обещаю, что не буду оценивать вас на вашем программистом. – lrussell851

+0

Я имею в виду деревья из игр, где пересекались два текстурированных квадроцикла. Если смотреть на кнопку, она должна выглядеть как +, а по сторонам - как треугольник. Может что-то нарисовать завтра, но я думаю, что с + становится ясно? В следующий раз я рисую напрямую. – Patrick

0

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

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

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

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

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

+0

Попытался переформулировать вопрос выше. Спасибо за ссылку! – Patrick

Смежные вопросы