2010-11-13 40 views

Répondre

1

Exemple de code d'un de mes anciens projets. Cela crée un cylindre "non bridé" (le haut et le bas sont vides).

int segments = 10; // Higher numbers improve quality 
int radius = 3; // The radius (width) of the cylinder 
int height = 10; // The height of the cylinder 

var vertices = new List<Vector3>(); 
for (double y = 0; y < 2; y++) 
{ 
    for (double x = 0; x < segments; x++) 
    { 
     double theta = (x/(segments - 1)) * 2 * Math.PI; 

     vertices.Add(new Vector3() 
     { 
      X = (float)(radius * Math.Cos(theta)), 
      Y = (float)(height * y), 
      Z = (float)(radius * Math.Sin(theta)), 
     }); 
    } 
} 

var indices = new List<int>(); 
for (int x = 0; x < segments - 1; x++) 
{ 
    indices.Add(x); 
    indices.Add(x + segments); 
    indices.Add(X + segments + 1); 

    indices.Add(x + segments + 1); 
    indices.Add(x + 1); 
    indices.Add(x); 
} 

Vous pouvez maintenant rendre le cylindre comme celui-ci:

GL.Begin(BeginMode.Triangles); 
foreach (int index in indices) 
    GL.Vertex3(vertices[index]); 
GL.End(); 

Vous pouvez également télécharger des sommets et indices dans un objet tampon de sommet pour améliorer les performances.

+0

Fiddler, votre code fonctionne bien. Pouvez-vous s'il vous plaît expliquer la cartographie des indices avec les sommets? Initialement, vous calculez les sommets pour le cercle inférieur et supérieur du cylindre, puis vous mappez ces sommets aux indices. La séquence n'est pas claire pour moi. Pouvez-vous marquer ces segments dans un exemple d'image? –

+0

Les sommets sont des points dans l'espace 3D. Les indices décrivent comment relier ces points en triangles (trois sommets par triangle). Voir ici pour plus de détails: http://www.opentk.com/doc/chapter/2/opengl/geometry/primitives –

1

La génération de la géométrie d'un cylindre est assez simple (considérons un cylindre aligné en Z). Permettez-moi de pseudocode:

points = list of (x,y,z) 
    where x = sin(a)*RADIUS, y = cos(a)*RADIUS, z = b, 
    for each a in [0..2*PI) with step StepA, 
    for each b in [0..HEIGHT] with step StepB 

A propos des indices: Supposons N égal au nombre de « niveaux » ou « tranches » du cylindre (qui dépend de la hauteur et STEPB) et M égal au nombre de points sur chaque "tranche" (qui dépend de StepA).

Le cylindre contient des quadriceps, chacun couvrant 2 tranches voisines, de sorte que les indices ressemblerait à ceci:

indices = list of (a,b,c,d) 
    where a = M * slice + point, 
      b = M * slice + (point+1) % M, 
      c = (M+1) * slice + (point+1) % M, 
      d = (M+1) * slice + point 
    for each slice in [0..N-2] 
    for each point in [0..M-1] 

Si vous avez besoin Normales pour le cylindre, ils sont simples à générer:

normals = (x/RADIUS,y/RADIUS,0) 
    for each (x,y,z) in points 

C'est tout pour la partie ronde du cylindre, vous pourriez aussi vouloir les "bouchons" mais je crois qu'ils sont faciles à faire.

Je vais laisser la partie amusante de la traduction de mon pseudo-code dans la langue de votre choix pour vous. :)

Le reste est de créer/lier le VBO, charger la géométrie, définir des pointeurs, utiliser votre shader de choix et appeler glDrawArrays (...) - tout tutoriel OpenGL 3 devrait couvrir cela; Connaissez-vous cette partie?

+0

Désolé, je ne comprends pas votre pseudo-code. J'ai trouvé OpenTK.Glu.Cylinder mais j'ai du mal à le faire fonctionner, peut-être que vous pouvez m'aider avec ça si vous utilisez OpenTK? ty – Chris

+0

Votre question à l'origine mentionné OpenGL 3 et VBO qui m'a suggéré que vous aimeriez générer la géométrie par vous-même. Pouvez-vous décrire vos problèmes avec Glu.Cylinder? – Kos

+0

Veuillez ne pas utiliser Glu.Cylinder. Glu était obsolète dans OpenGL 3.0 et n'est plus supporté. –