85 votes

Dessiner Sphère dans OpenGL sans utiliser gluSphere ()?

Existe-il des tutoriels qui expliquent comment je peux dessiner une sphère en OpenGL sans avoir à utiliser gluSphere()?

De nombreux tutoriels 3D OpenGL sont juste sur les cubes. J'ai cherché mais la plupart des solutions de dessiner une sphère d'utiliser gluSphere(). Il y a aussi un site qui a le code pour le dessin d'une sphère à ce site , mais ça n'explique pas les mathématiques derrière le dessin de la sphère. J'ai également d'autres versions de la façon de dessiner la sphère des polygones au lieu de quads dans ce lien. Mais encore une fois, je ne comprends pas comment les sphères sont dessinés avec le code. Je veux être en mesure de visualiser, de sorte que je puisse modifier la sphère si j'en ai besoin.

295voto

Kevin Points 17955

Une façon vous pouvez faire est de commencer avec un platonicien solide, avec des faces triangulaires - un octaèdre, par exemple. Ensuite, prendre le de chaque triangle et, récursivement, la diviser en triangles plus petits, comme suit:

recursively drawn triangles

Une fois que vous avez suffisamment de points, vous normaliser leurs vecteurs, de sorte qu'ils sont tous à une distance constante du centre de la solide. Cela provoque les côtés bosse dans une forme qui ressemble à une sphère, avec l'augmentation de la finesse comme vous augmentez le nombre de points.

La normalisation ici, c'est le mouvement d'un point, de sorte que son angle par rapport à un autre point est la même, mais la distance entre eux est différent. Voici deux dimensions, par exemple.

enter image description here

A et B sont de 6 unités de distance. Mais supposons que nous voulons trouver un point sur la ligne AB de 12 unités A.

enter image description here

On peut dire que C est la forme normalisée de B par rapport à A, avec la distance 12. Nous pouvons obtenir C avec un code comme ceci:

#returns a point collinear to A and B, a given distance away from A. 
function normalize(a, b, length):
    #get the distance between a and b along the x and y axes
    dx = b.x - a.x
    dy = b.y - a.y
    #right now, sqrt(dx^2 + dy^2) = distance(a,b).
    #we want to modify them so that sqrt(dx^2 + dy^2) = the given length.
    dx = dx * length / distance(a,b)
    dy = dy * length / distance(a,b)
    point c =  new point
    c.x = a.x + dx
    c.y = a.y + dy
    return c

Si nous faisons ce processus de normalisation sur beaucoup de points, tous de la même point (A) et avec la même distance R, les normalisé points se trouvent tous sur l'arc de cercle de centre A et de rayon R.

bulging line segment

Ici, les points noirs de commencer sur une ligne et "renflement" dans un arc.

Ce processus peut être étendu en trois dimensions, dans ce cas, vous obtenez une sphère plutôt que d'un cercle. Il suffit d'ajouter une dz composante de la fonction de normalisation.

normalized polygons

level 1 bulging octahedronlevel 3 bulging octahedron

Si vous regardez la sphère à Epcot, vous pouvez sorte de voir cette technique au travail. c'est un dodécaèdre avec enflé-dehors de visages pour donner un aspect plus rond.

10voto

Constantinius Points 13708

Le code de l'échantillon est rapidement expliqué. Vous devriez regarder dans la fonction void drawSphere(double r, int lats, int longs). Les paramètres lat définit le nombre de lignes horizontales que vous voulez avoir dans votre sphère et lon combien de lignes verticales. r est le rayon de la sphère.

Maintenant, il y a un double itération sur lat/lon et les coordonnées des vertices sont calculés, en utilisant la trigonométrie simple.

Le calcul de sommets sont maintenant envoyés à votre GPU à l'aide de glVertex...() comme GL_QUAD_STRIP, ce qui signifie que vous sont l'envoi de chacun des deux sommets qui forment un quad auparavant, deux envoyés.

Tout ce que vous avez à comprendre maintenant est de savoir comment les fonctions trigonométriques de travail, mais je pense que vous pouvez comprendre facilement.

2voto

bigdatadev Points 1171

Si vous vouliez être sournois comme un renard, vous pouvez convertir à moitié le code de GLU. Consultez le code source de MesaGL (http://cgit.freedesktop.org/mesa/mesa/).

2voto

Walter Points 329

Voir le livre rouge OpenGL: http://www.glprogramming.com/red/chapter02.html#name8 Il résout le problème par subdivision de polygone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X