jeudi 26 janvier 2012

Cercles, ellipses et des polygones réguliers en OpenGL ES

L'utilisation de l'iPhone d'OpenGL ES signifie que beaucoup de jeux et autres programmes peuvent être portés assez rapidement. Malheureusement, l'iPhone utilise une version relativement ancienne d'OpenGL ES (1.1), et par la nature même d'un moteur graphique incorporé, beaucoup des subtilités de l'OpenGL expansives ont été enlevés, y compris les fonctions d'attirer un grand nombre de formes primitives standards .

Les lignes et les carrés sont assez facile, bien sûr, mais qu'en est-il des formes plus complexes? Eh bien, vous êtes sur votre propre pour ceux, donc, sauf si vous êtes confortable avec faire un peu de mathématiques, vous allez avoir des problèmes avec OpenGL ES. Voici un exemple - comment voulez-vous dessiner une ellipse ou un cercle en OpenGL? Je ne parle pas d'une sphère (nous allons voir que dans un post plus tard, peut-être), mais un cercle à deux dimensions? Ou un triangle?

Ces deux fonctions de dessin (respectivement) une ellipse et un cercle (qui est juste une ellipse avec la hauteur et la largeur égale) à un endroit donné, soit remplie, ou décrites. Mais, ils font réellement plus que cela. Vous pouvez spécifier le degré de précision que vous voulez de l'ellipse à l'aide de l'argument des segments. Si vous spécifiez, trois, par exemple, il va dessiner un polygone à trois côtés (aka un triangle). Si vous spécifiez 360, vous obtiendrez un polygone à 360 côtés réguliers, ce qui va ressembler à un cercle sur l'ensemble mais le plus grand affiche. Pour la plupart des fins sur l'iPhone, une valeur supérieure à 12 ressemble à un cercle. Une valeur inférieure à 3 ne fonctionne pas, mais la vérification d'erreur est de votre responsabilité. :)


void GLDrawEllipse (int segments, CGFloat width, CGFloat height, CGPoint center, bool filled)
{
glTranslatef(center.x, center.y, 0.0);
GLfloat vertices[segments*2];
int count=0;
for (GLfloat i = 0; i {
vertices[count++] = (cos(degreesToRadian(i))*width);
vertices[count++] = (sin(degreesToRadian(i))*height);
}
glVertexPointer (2, GL_FLOAT , 0, vertices);
glDrawArrays ((filled) ? GL_TRIANGLE_FAN : GL_LINE_LOOP, 0, segments);
}
void GLDrawCircle (int circleSegments, CGFloat circleSize, CGPoint center, bool filled)
{
GLDrawEllipse(circleSegments, circleSize, circleSize, center, filled);
}


Aucun commentaire: