Alguém poderia explicar como seria possível criar vértices, índices e coordenadas de textura de uma esfera? Há uma surpreendente falta de documentação sobre como fazer isso e é algo que estou interessado em aprender.
Eu tentei o óbvio, pesquisando no google, procurando no gamedev.net, etc. No entanto, nada cobre as gerações de pontos esféricos, indexando-os e texturizando.
rendering
geometry
procedural-generation
judeclarke
fonte
fonte
Respostas:
Existem duas abordagens gerais:
O extremo esquerdo é denominado esfera uv e o extremo direito, icosfera.
GLUT tende a usar a abordagem uv: observe a função
glutSolidSphere()
no código-fonte freeglut .Aqui está um excelente artigo sobre a produção de uma icosfera: http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html
Você também pode achar isso interessante: http://kiwi.atmos.colostate.edu/BUGS/geodesic/text.html descreve uma abordagem para organizar as faces em zonas.
http://vterrain.org/Textures/spherical.html fornece uma excelente descrição de como você pode optar por texturizá-las.
fonte
Existem 2 maneiras de fazer isso:
Ande theta e phi em coordenadas esféricas, gere faces e tris
Crie um icosaedro e subdividir recursivamente as faces até atingir o mosaico desejado.
Esfera usando coordenadas esféricas andar
Pela primeira vez, basta usar um aninhado duplo para caminhar theta e phi. Ao andar com theta e phi, você gira triângulos para criar sua esfera.
O código que faz isso será mais ou menos assim:
Observe acima, é importante enrolar a tampa superior e inferior usando apenas tris, não quads.
Esfera icosaédrica
Para usar um icosaedro, você apenas gera os pontos do icosaedro e termina triângulos a partir dele. Os vértices de um icosaedro sentado na origem são:
Você então precisa apenas olhar o diagrama de um icosaedro e as faces do vento a partir desses verts. Eu já tenho um código que faz isso aqui .
fonte
Se os pontos não precisam ser localmente uniformes, mas devem ser globalmente uniformes e não precisam seguir nenhum padrão definido, você pode usar uma variante do algoritmo de arremesso de dardos para distribuir n pontos em uma esfera com raio r , em média dist pontos distantes. Esses valores são aproximadamente:
No caso mais simples, você pode escolher uniformemente pontos aleatoriamente, escolhendo duas variáveis uniformemente distribuídas u e v de (0, 1) e calculando as coordenadas polares a partir delas de acordo com as fórmulas θ = 2 × π × u e ϕ = arco cos (2 x v - 1); descartando pontos que estejam muito próximos dos pontos já escolhidos. Para um algoritmo um pouco mais complexo e com desempenho significativamente melhor, consulte " Dart Throwing on Surfaces " de Cline, Jeschke, White, Razdan e Wonka.
Depois de escolher seus quatro primeiros pontos (supondo que nenhum deles seja degenerado , ou seja - eles não estão no mesmo grande círculo, mas isso é altamente improvável), você pode criar quatro faces entre eles e cada vez que adicionar um novo ponto, você pode dividir a face à qual pertence de acordo com três sub-faces.
Para fins de texturização, você pode mapear os pontos para um mapa de cubo.
fonte