2010-11-10 31 views
0

Je fais mes premiers pas avec OpenGL dans processing.org. Je voudrais dessiner deux triangles croisés, mais je ne sais pas vraiment comment faire pivoter les triangles pour les traverser.Dessinez deux triangles croisés dans 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(); 

Les triangles doivent être croisés comme ces vieux modèles 3D d'arbres. Ils devraient tourner et se déplacer comme un objet dans une utilisation ultérieure, que j'ai pensé travailler avec pop et pousser autour des deux sommets, je ne peux pas comprendre la rotation pour obtenir ces deux triangles ensemble.

Répondre

0

Merci à votre code et une géométrie sur le papier, j'ai finalement trouvé la solution (s) pour mon problème:

solution triangle Crossed:

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

Ou même avec quatre triangles:

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

Si je vous comprends bien, vous essayez de faire pivoter les triangles indépendamment les uns des autres? Dans ce cas, vous devrez utiliser gl.PushMatrix() avant le triangle et gl.PopMatrix(); après le triangle. Ex:

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

Sinon, la rotation supérieure sera appliquée aux deux triangles.

Aussi, j'ai remarqué que vous avez dit que vous avez besoin de deux "rectangles" croisés. Si c'est le cas, vous aurez besoin de 4 triangles ou d'un quad pour chacun. Donc, un Quad, rectangle, serait la suivante:

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

ou mieux encore

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

Hope this helps.

Ahh, maintenant nous allons quelque part! Ok c'est très simple. En ce qui concerne la rotation, vous pouvez éviter cela et aller directement à dessiner les quads les uns sur les autres. Voulez-vous en fonction de vos valeurs initiales de 25 et 50 voici un exemple avec des triangles:

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

Exemple avec 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 cela est juste un exemple, alors ce code doit être bien. Cependant, si vous allez en afficher des multiples, vous allez vouloir stocker le code de rendu quadruple dans un objet de tampon de vertex et ensuite rendre plusieurs des objets de tampon de vertex.

+0

Je vais essayer d'être plus clair: J'ai juste besoin de deux triangles, qui devraient être franchies au milieu (comme ces vieux modèles 3D des arbres, il s difficile à expliquer). Ils devraient tourner ensemble, ce que j'ai obtenu jusqu'ici, mais pas les triangles croisés eux-mêmes. – Patrick

+0

Eh bien, j'ai deux solutions pour vous pour l'arbre. Ce que je dois savoir, c'est si vous voulez dire les arbres qu'ils utilisaient dans les jeux où les feuilles n'étaient que deux quads croisés avec une texture sur eux ou si vous voulez dire un sommet en forme de pyramide pour les feuilles. Sinon, je ne suis pas sûr de ce que vous voulez dire par deux trianges croisées. Peut-être que tu pourrais te moquer de quelque chose de simple en peinture très vite. Je promets que je ne vous noterai pas sur votre art programmeur. – lrussell851

+0

Je veux dire les arbres des jeux, où deux quads texturés où croisés. Si vu du bouton, il devrait ressembler à un +, et à partir des côtés comme un triangle. Peut dessiner quelque chose demain, mais je suppose qu'avec le + ça devient clair? La prochaine fois, je vais dessiner directement. – Patrick

0

Je vais essayer de répondre à votre question en plusieurs parties.

1) Ce code dessine un seul rectangle, mais vous mentionnez 2 rectangle et 2 triangles et vous ne savez pas exactement ce que vous essayez de faire.

2) "Les deux rectangles doivent agir comme un objet plus tard". Ce n'est vraiment pas possible via OpenGL. Dans opengl (au moins au niveau débutant), des objets entiers sont créés en enchaînant des commandes simples. Donc vous ne dites pas "voici un objet, maintenant dessinez ici, ici et ici". Au lieu de cela, vous dites "dessinez ce triangle, dessinez maintenant ce rectangle, tournez maintenant, dessinez maintenant ce triangle". C'est un processus étape par étape. OpenGL ne connaît rien aux objets ou aux modèles, c'est à vous de définir cela dans votre code, puis de dire à OpenGL comment dessiner chaque objet.

Une des meilleures sources pour apprendre OpenGL est les tutoriels NeHe trouvés ici http://nehe.gamedev.net/ Ils devraient avoir des versions java des tutoriels, sinon pas difficile à comprendre.

+0

J'ai essayé de reformuler la question ci-dessus. Merci pour le lien! – Patrick