¿Podría alguien explicar cómo sería posible crear una esfera de vértices, índices y coordenadas de textura? Hay una sorprendente falta de documentación sobre cómo hacerlo y es algo que me interesa aprender.
He intentado lo obvio, buscando en Google, buscando en gamedev.net, etc. Sin embargo, nada cubre las generaciones de puntos esféricos, indexándolos y texturizando.
rendering
geometry
procedural-generation
judeclarke
fuente
fuente
Respuestas:
Hay dos enfoques generales:
El extremo izquierdo se denomina esfera ultravioleta y el extremo derecho una icosfera.
GLUT tiende a usar el enfoque uv: mira la función
glutSolidSphere()
en el código fuente de freeglut .Aquí hay un excelente artículo sobre la producción de una icosfera: http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html
También puede encontrar esto interesante: http://kiwi.atmos.colostate.edu/BUGS/geodesic/text.html describe un enfoque para organizar las caras en zonas.
http://vterrain.org/Textures/spherical.html ofrece una excelente descripción de cómo puede elegir texturizarlos.
fuente
Hay 2 formas de hacerlo:
Recorre theta y phi en coordenadas esféricas, genera caras y tris
Crea un icosaedro y subdivide recursivamente las caras hasta que se alcance la teselación deseada.
Esfera utilizando coordenadas esféricas a pie
Por primera vez, solo usa un doble anidado para caminar theta y phi. A medida que caminas theta y phi, giras triángulos para crear tu esfera.
El código que lo haga se verá así:
Tenga en cuenta lo anterior, es importante enrollar la tapa superior y la tapa inferior usando solo tris, no quads.
Esfera icosaédrica
Para usar un icosaedro, solo genera los puntos del icosaedro y luego enrolla triángulos a partir de él. Los vértices de un icosaedro sentado en el origen son:
Luego, solo tiene que mirar un diagrama de un icosaedro y caras de viento de esos verts. Ya tengo un código que lo hace aquí .
fuente
Si los puntos no tienen que ser localmente uniformes, pero deben ser globalmente uniformes, y no tienen que seguir ningún patrón establecido, puede usar una variante del algoritmo de lanzamiento de dardos para distribuir n puntos en una esfera con radio r , en promedio puntos dist separados. Estos valores son entonces aproximadamente:
En el caso más simple, puede seleccionar puntos al azar de manera uniforme seleccionando dos variables uniformemente distribuidas u y v de (0, 1) y calculando las coordenadas polares a partir de ellas de acuerdo con las fórmulas θ = 2 × π × u y ϕ = arco cos (2 × v - 1); luego descartar cualquier punto que se encuentre demasiado cerca de los puntos ya seleccionados. Para un algoritmo un poco más complejo y con un rendimiento significativamente mejor, vea " Dart Throwing on Surfaces " de Cline, Jeschke, White, Razdan y Wonka.
Después de elegir sus primeros cuatro puntos (suponiendo que no tres de ellos estén degenerados , es decir, no se encuentran en el mismo gran círculo, pero es muy poco probable), puede crear cuatro caras entre ellos, y cada vez que agrega un nuevo punto, puede dividir la cara a la que pertenece en tres subcaras.
Para fines de texturizado, puede asignar los puntos a un mapa de cubos.
fuente