2011-09-03 2 views
3

J'ai essayé pendant les 3 dernières heures de comprendre comment utiliser la formule de courbe de Bézier, glMap1f et glEvalCoord1f pour créer une forme incurvée. (je veux fondamentalement créer the right of kirby).Comment dessiner des formes incurvées 2D irrégulières dans OpenGL

Cependant, j'ai peu de succès. Quand j'utilise glBegin (GL_LINE_STRIP), il trace le contour, mais il y a un grand + (comme votre axe x et y). Quand j'essaie de (GL_POLYGON), le remplissage fonctionne, mais il a un diamant connecté aux 4 points que j'utilise.

+3

Pouvez-vous publier des images montrant votre problème ou décrire un peu plus ? Vous n'arrivez pas à comprendre ce que vous essayez d'accomplir et ce que vous obtenez. Le lien ne fonctionne pas. – neodelphi

+1

Ce lien avec l'image est cassé –

+0

@VJo: Image Fix'd. – genpfault

Répondre

0

J'ai découvert ce qui ne va pas. Il s'avère que j'utilisais sizeof(array) incorrectement. (Spécifiquement, en référence au code ci-dessous, au lieu d'utiliser i < numCurves, j'ai naïvement essayé de faire i < sizeof(points))

Par conséquent, au lieu de dessiner 4-5 points, j'ai fini par dessiner 192 courbes, ce qui conduit à des résultats étranges. Le diamant au milieu était dû à ne pas se connecter au point de départ. Pour référence pour les futurs qui veut faire, voici le code:

Erroneous Image:
Erroneous Picture http://img535.imageshack.us/img535/8207/failfd.png

Produit final:
Final Product http://img685.imageshack.us/img685/7641/finalsa.png

void drawIrregularPolygon(GLfloat points[][4][3], int numCurves) 
// REQUIRES: GLfloat points to be a polygon and center of circle to be current matrix 
// EFFECTS: An irregular shape would be drawn 
{ 
    for (int i = 0; i < numCurves; i++) 
    { 
     glMap1f(GL_MAP1_VERTEX_3, 0.0f, 1.0f, 3, 4, &points[i][0][0]); 
     glBegin(GL_POLYGON); //replace GL_POLYGON with GL_LINE_STRIP if you need outline 
     for (int j = 0; j <= TOTAL_SEGMENTS; j++) 
      glEvalCoord1f((GLfloat) j/TOTAL_SEGMENTS); 
     glVertex2f(points[0][0][0], points[0][0][1]); 
     glEnd(); 
    } 
} 
Questions connexes