A maneira de gerar as arestas e as faces de uma forma primitiva como uma caixa, um cone e tudo o que você citou é gerá-las ao mesmo tempo em que cria os vértices. De fato, você deve criar os vértices de uma maneira lógica, para facilitar o cálculo das arestas e faces em conformidade.
Existem algoritmos que tomam como entrada um conjunto de pontos no espaço e calculam a chamada " triangulação do conjunto de pontos " sobre ele, mas o problema da triangulação do conjunto de pontos é NP-completo , de modo que é mais rápido criar bordas e faces conforme você avança, apenas calcula os vértices e deixa um algoritmo fazer o trabalho. Apenas informando que esta solução existe.
Além dessa solução ineficiente, acho que você só pode tratar os primitivos caso a caso, como nos exemplos a seguir.
Uma malha é vértices e faces . As arestas estão contidas na descrição das faces, a menos que sua malha contenha linhas que não compõem faces. Os vértices são tuplas de 3 coordenadas de ponto flutuante. As arestas são simplesmente pares de referências aos vértices, mas, novamente, você certamente não precisará deles. Digamos, por exemplo, que seus vértices estão em uma matriz indexada. Bem, suas bordas podem então ser pares de índices dessa matriz. As faces são trigêmeos de referências a vértices ou trigêmeos de índices no caso de matriz indexada .
Você deve ser capaz de contar os vértices, arestas e faces que compõem cada uma dessas formas primitivas, porque poder contá-las significa entender as propriedades do objeto, o que ajuda a criar o método com o qual você as construirá, usando loops e outras ferramentas como veremos.
Cone
Para um cone com n + 2 vértices, 3n arestas e 2n faces:
- Faça dois vértices separados.
- Faça um círculo em torno de um dos vértices (o vértice base), que está dentro de um plano perpendicular ao segmento entre os dois primeiros vértices. Espero que você possa fazer um círculo usando trigonometria, certo? Isso já é todos os vértices do cone. Isso também é um terço de todas as arestas (existem n arestas no círculo e 3n no total).
- Faça n arestas do vértice base aos n vértices no círculo. Você pode fazer metade das faces (que são n faces) ao fazer isso.
- Faça n arestas do vértice da ponta aos n vértices no círculo. Você pode fazer a outra metade das faces (que são n faces) ao fazer isso.
1)
2)
3)
4)
Resultado final:
Você também pode criar arestas e faces ao executar o loop que forma o círculo. Mesma complexidade, mesma coisa. Faça um vértice no círculo, armazene-o em sua matriz de vértices, adicione a aresta correspondente (par de índices) à matriz de pares de índices, se quiser, e finalmente adicione a face correspondente à sua matriz de trigêmeos de índices . Vá para o próximo vértice.
O cilindro e o tubo: não fazendo o mesmo trabalho duas vezes e quads
Novamente, para o tubo, ele começa com um vértice e um círculo que será o centro do disco superior ou inferior do cilindro:
- Faça um vértice.
- Faça um círculo ao redor do vértice. Adicione arestas (se desejar arestas) entre os vértices sucessivos do círculo e entre o vértice central e cada vértice do círculo. Adicione faces entre cada trio de vértices feitos do vértice central e dois vértices sucessivos no círculo.
- Duplique tudo isso, traduza a cópia na direção perpendicular à base que você acabou de fazer, pelo comprimento do cilindro desejado.
- Vincule a parte superior e a inferior.
Para vincular a parte superior e a inferior, você deve fazer quadriláteros entre pares de pares de vértices que se enfrentam. Então pense no futuro e por que não tornar-se uma função que cria duas faces triangulares em quatro vértices?
Feito. Observe que desta vez usamos o fato de que a mesma estrutura (círculo + centro) aparece duas vezes em um cilindro para usar um atalho. Não precisamos fazer todos os vértices, arestas e faces manualmente, ao contrário do cone onde era necessário.
Seguindo esse princípio de preguiça, também é possível fazer apenas um quarto do círculo e duplicá-lo, e novamente, fazer um círculo completo com transformações muito simples (válidas para qualquer círculo, também com o cone), mas isso é realmente um exagero para um forma não tão complexa.
Você sempre deve usar as propriedades geométricas dos objetos criados para simplificar sua criação . Ou seja, suas simetrias e invariantes .
Para um cilindro, apenas não faça o vértice base, apenas faça o círculo, duplique, traduza a cópia, faça os quadríceps, pronto.
A esfera e a cápsula: adicionando complexidade, ainda não são o mesmo trabalho duas vezes
Para criar uma cápsula, queremos criar uma esfera UV, dividi-la em duas metades, traduzir a primeira metade e depois vincular as duas com os lados das cápsulas.
Novamente, é possível criar apenas um oitavo (!!) da esfera, duplicá-lo e invertê-lo e, em seguida, duplicar e reverter o resultado, exceto em outro eixo, etc., para obter uma esfera completa, em 4 etapas (crie o oitavo , duplicar e reverter três vezes). Talvez exagere, mas menos do que no caso do círculo.
Uma simples esfera UV:
De fato, fazemos apenas metade dela (por exemplo), duplicamos essa metade, vire a cópia de cabeça para baixo e a traduzimos pelo comprimento da cápsula:
Vinculamos a metade superior e inferior:
O trabalho real (um tanto) árduo vem da trigonometria que entra na criação de uma esfera. O conjunto de todos os vértices pertencentes a uma esfera UV pode ser descrito como o conjunto de todos os pontos do formulário:
onde R é o raio da esfera e, para um certo número inteiro positivo mesmo N , temos a constante
θ = × π / N ,
k e n são números inteiros com k variando de 0 a 2N-1 e n varia de N / 2 a + N / 2 .
Para formar uma meia esfera ou um oitavo de uma esfera, você deve restringir o conjunto de valores tomados por k e n .
Se k fossem números reais e não apenas números inteiros, você obteria uma esfera inteira, não apenas os vértices em sua superfície. Então, o que fizemos aqui é rasterizar a equação da superfície do primitivo .
O toro temível : é fácil depois de tudo o que vimos!
Mais uma vez, mais trigonometria, mais vértices, mais quads, mais simetrias, mais invariantes ... mais geometria! Descubra a equação para a superfície de um toro, "rasterize-o" corretamente, simplifique o problema usando as simetrias (óbvias) do toro e, finalmente, faça um loop no conjunto de vértices que você acabou de definir e faça as arestas e faces à medida que ir!
Vejo? Completamente simples.