Quelqu'un pourrait-il expliquer comment il serait possible de créer une sphère sommets, indices et coordonnées de texture? Il y a un manque surprenant de documentation sur la façon de le faire et c'est quelque chose que je suis intéressé à apprendre.
J'ai essayé l'évidence, googler, regarder sur gamedev.net, etc. Cependant, rien ne couvre les générations de points sphériques, les indexant et les textures.
rendering
geometry
procedural-generation
judeclarke
la source
la source
Réponses:
Il existe deux approches générales:
La plus à gauche est appelée la sphère uv et la plus à droite une icosphère.
GLUT a tendance à utiliser l'approche uv: regardez la fonction
glutSolidSphere()
dans le code source freeglut .Voici un excellent article sur la production d'une icosphère: http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html
Vous pouvez également trouver cela intéressant: http://kiwi.atmos.colostate.edu/BUGS/geodesic/text.html il décrit une approche pour organiser les visages en zones.
http://vterrain.org/Textures/spherical.html donne une excellente description de la façon dont vous pouvez choisir de les texturer.
la source
Il y a 2 façons de procéder:
Parcourez thêta et phi en coordonnées sphériques, générez des visages et des tris
Créez un icosaèdre et subdivisez récursivement les faces jusqu'à ce que la tessellation souhaitée soit atteinte.
Sphère utilisant des coordonnées sphériques à pied
Pour la première façon, vous utilisez simplement un double imbriqué pour parcourir thêta et phi. En parcourant thêta et phi, vous faites tourner des triangles pour créer votre sphère.
Le code qui le fait ressemblera à ceci:
Donc, notez ci-dessus, il est important d'enrouler le capuchon supérieur et le capuchon inférieur en utilisant uniquement des tris, pas des quads.
Sphère icosaédrique
POUR utiliser un icosaèdre, il vous suffit de générer les points de l'icosaèdre, puis d'enrouler des triangles. Les sommets d'un icosaèdre assis à l'origine sont:
Il suffit ensuite de regarder un diagramme d'un icosaèdre et des faces de vent de ces verts. J'ai déjà du code qui le fait ici .
la source
Si les points ne doivent pas nécessairement être localement uniformes, mais doivent être globalement uniformes et ne doivent suivre aucun modèle défini, vous pouvez utiliser une variante de l'algorithme de lancement de fléchettes pour distribuer n points sur une sphère de rayon r , en moyenne dist points à part. Ces valeurs sont alors approximativement:
Dans le cas le plus simple, vous pouvez ensuite sélectionner uniformément des points au hasard en sélectionnant deux variables uniformément réparties u et v de (0, 1) et en calculant les coordonnées polaires à partir d'elles selon les formules θ = 2 × π × u et ϕ = arc cos (2 × v - 1); puis en supprimant tous les points trop proches des points déjà sélectionnés. Pour un algorithme légèrement plus complexe et nettement plus performant, voir " Dart Throwing on Surfaces " de Cline, Jeschke, White, Razdan et Wonka.
Après avoir choisi vos quatre premiers points (en supposant qu'aucun d'entre eux n'est dégénéré , c'est-à-dire qu'ils ne se trouvent pas sur le même grand cercle, mais c'est très peu probable), vous pouvez créer quatre faces entre eux, et chaque fois que vous ajoutez un nouveau point, vous pouvez diviser la face à laquelle il appartient en conséquence en trois sous-faces.
À des fins de texturation, vous pouvez ensuite mapper les points sur une carte de cube.
la source