Generación de geometría procesal

10

Recientemente he estado buscando en SceneKit para OS X y noté que hay varios métodos de fábrica para crear formas geométricas como:

Caja, Cápsula, Cono, Cilindro, Plano, Pirámide, Esfera, Toro y Tubo.

Estoy interesado en agregar formas tan primitivas a mi renderizador, pero estoy luchando por encontrar una fuente razonable a partir de la cual pueda obtener una comprensión de la generación de procedimientos. Hay varios recursos que detallan la teoría, pero carecen del código fuente apropiado para respaldarla.

SceneKit proporciona métodos de fábrica que permiten establecer dinámicamente los atributos de tales formas. En el caso del cuadro, puede proporcionar valores enteros para el número de segmentos de ancho, alto y profundidad en los que se debe dividir cada cara.

Entiendo la teoría pero carece del conocimiento para comenzar a subdividir las caras de geometría para lograr el efecto deseado.

Es probable que los vértices de cada forma sean bastante fáciles de generar en bucles simples. Lo que me sorprende es saber cómo crear las caras, o más bien las coordenadas de textura apropiadas para cada cara. Las normales se pueden calcular por cara, así que estoy bastante seguro de que podría lograr lo que quiero, es solo saber por dónde empezar.

¿Alguien puede proporcionar detalles sobre la geometría procesal? Lo que realmente necesito es un código fuente para obtener información. He buscado tutoriales altos y bajos, pero hasta ahora solo he encontrado algunos sitios o blogs razonables. Cualquier buen libro, tutoriales, blogs o trabajos de investigación serán apreciados.

Editar basado en comentarios

Debería haber aclarado que sé cómo crear vértices para formas básicas, la mayoría de estos probablemente se pueden lograr mediante bucles simples. Lo que no entiendo es cómo crear caras a partir de la matriz generada de vértices. ¿Cómo creo una franja triangular, o triángulos, a partir de una matriz de vértices aparentemente desordenada?

Supongo que una vez que pase este punto, puedo crear las normales de cada cara. Aunque todavía no he profundizado en esto, he visto muchas referencias a esto y estoy seguro de que será lo suficientemente fácil de implementar.

Idealmente, me gustaría poder generar geometría a partir de un conjunto dado de propiedades, como la forma en que proporciona SceneKit. Dado que SceneKit lo ha hecho, y puedes hacer cosas similares en Blender y Maya, etc., supongo que no estoy tratando de implementar lo imposible.

El aspecto final sería aplicar texturas. Nuevamente, esto no es algo que he implementado pero que he leído y conozco los requisitos.

El principal problema aquí es que sé lo que quiero lograr, pero estoy luchando por descifrar cómo implementar las primitivas antes mencionadas. Tenía la esperanza de poder encontrar algo parecido al conocimiento a través del código fuente, pero hasta ahora no he encontrado nada adecuado.

CaptainRedmuff
fuente
Dices que tu problema es subdividir la geometría, pero luego dices que hacer los vértices debería ser fácil, y luego dices que tu problema es cómo crear caras, y luego dices que tu problema es el mapeo de texturas. ¿Cual es tu problema? ¿Puedes generar las posiciones de vértice? ¿Puedes generar los bordes y las caras? Además, las coordenadas de textura dependen de su textura y de lo que desea lograr con ella, por lo que la pregunta sobre las coordenadas de textura no es buena. Finalmente, la generación de primitivas se trata simplemente de geometría y las personas rara vez la llaman "geometría de procedimiento", aunque eso es lo que es.
jrsala
Entiendo cómo crear la geometría para formas simples como un cubo o un plano, es la creación de las caras que no entiendo. ¿Cómo creo las caras a partir de un montón de vértices? Trazar los puntos para formas más complejas es parte del problema, aunque tengo una comprensión básica. Pegarlos todos juntos en una tira de triángulos o triángulos es lo que estoy luchando para entender.
CaptainRedmuff
OK, gracias por los detalles. Es posible que desee editar su pregunta para aclararla. Tiempo de respuesta!
jrsala

Respuestas:

11

La forma de generar los bordes y las caras de una forma primitiva como una caja, un cono y todos los que citó es generarlos al mismo tiempo que crea los vértices. De hecho, debe crear los vértices de una manera lógica que facilite el cálculo de los bordes y las caras en consecuencia.

Hay algoritmos que toman como entrada un conjunto de puntos en el espacio y calculan una llamada " triangulación de conjunto de puntos " sobre él, pero el problema de la triangulación de conjunto de puntos es NP-completo , por lo que es más rápido hacer los bordes y las caras. a medida que avanza, solo tiene que calcular los vértices y dejar que un algoritmo haga el trabajo. Solo para hacerle saber que esta solución existe.

Además de esta solución ineficiente, creo que solo puede tratar las primitivas según el caso, como en los ejemplos que siguen.

Una malla es vértices y caras . Los bordes están contenidos dentro de la descripción de las caras a menos que su malla contenga líneas que no formen caras. Los vértices son tuplas de 3 coordenadas de punto flotante. Los bordes son simplemente pares de referencias a los vértices, pero de nuevo seguramente no los necesitará. Digamos, por ejemplo, que sus vértices están en una matriz indexada. Bueno, tus bordes podrían ser pares de índices de esa matriz. Las caras son trillizos de referencias a vértices o trillizos de índices en el caso de matriz indexada .

Debería poder contar los vértices, aristas y caras que conforman cada una de estas formas primitivas porque poder contarlas significa comprender las propiedades del objeto que le ayuda a diseñar el método con el que las construirá, utilizando bucles y otras herramientas como veremos.

Cono

Para un cono con n + 2 vértices, 3n aristas y 2n caras:

  1. Haz dos vértices separados.
  2. Haz un círculo alrededor de uno de los vértices (el vértice base), que está dentro de un plano perpendicular al segmento entre los dos primeros vértices. Espero que puedas hacer un círculo usando trigonometría, ¿verdad? Eso ya son todos los vértices del cono. Eso también es un tercio de todos los bordes (hay n bordes en el círculo y 3n en total).
  3. Haz n aristas desde el vértice base hasta los n vértices del círculo. Puedes hacer la mitad de las caras (eso es n caras) mientras haces eso.
  4. Haz n aristas desde el vértice de la punta hasta los n vértices del círculo. Puedes hacer la otra mitad de las caras (eso es n caras) mientras haces eso.

1) Dos vértices 2) y un circulo
3) y caras
4) y caras
Resultado final:resultado

También puede crear los bordes y las caras mientras ejecuta el bucle que forma el círculo. La misma complejidad, la misma cosa. Haga un vértice en el círculo, guárdelo en su conjunto de vértices, agregue el borde correspondiente (par de índices) al conjunto de pares de índices si lo desea, y finalmente agregue la cara correspondiente a su conjunto de tripletas de índices . Pasar al siguiente vértice.

El cilindro y el tubo: no hacen el mismo trabajo dos veces, y quads

Nuevamente, para el tubo comienza con un vértice y un círculo que será el centro del disco superior o inferior del cilindro:

  1. Haz un vértice.
  2. Haz un círculo alrededor del vértice. Agregue aristas (si desea aristas) entre los vértices sucesivos del círculo y entre el vértice central y cada vértice del círculo. Agregue caras entre cada triplete de vértices formados por el vértice central y dos vértices sucesivos en el círculo.
  3. Duplique todo eso, traduzca la copia en la dirección perpendicular a la base que acaba de hacer, por la longitud del cilindro deseado.
  4. Enlace la parte superior y la parte inferior.

Para vincular la parte superior y la inferior, debe hacer cuádriceps entre pares de pares de vértices uno frente al otro. Entonces piense en el futuro y ¿por qué no convertirse en una función que haga dos caras triangulares de cuatro vértices?

Hecho. Tenga en cuenta que esta vez usamos el hecho de que la misma estructura (círculo + centro) aparece dos veces en un cilindro para tomar un atajo. No tenemos que hacer todos los vértices, bordes y caras a mano, al contrario del cono donde era necesario.

Siguiendo este principio de pereza, también es posible hacer una cuarta parte del círculo y duplicarlo, y nuevamente, hacer un círculo completo con transformaciones muy simples (válido con cualquier círculo, también con el cono), pero eso es realmente excesivo para un Forma no tan compleja.

Siempre debes usar las propiedades geométricas de los objetos que haces para simplificar su creación . A saber, sus simetrías e invariantes .

Para un cilindro, simplemente no haga el vértice base, solo haga el círculo, duplique, traduzca la copia, haga los quads, listo.

La esfera y la cápsula: agregando complejidad, todavía no es lo mismo trabajar dos veces

Para crear una cápsula, queremos crear una esfera UV, dividirla en dos mitades, traducir la primera mitad y luego vincular las dos con los lados de las cápsulas.

De nuevo, es posible hacer solo un octavo (!!) de la esfera, luego duplicarlo y revertirlo, y luego duplicar e invertir el resultado excepto a lo largo de otro eje, etc., para obtener una esfera completa, en 4 pasos (crear el octavo , duplicar e invertir tres veces). Quizás exagerado, pero menos que en el caso del círculo.

Una simple esfera UV:
esfera

De hecho, solo hacemos la mitad (por ejemplo), duplicamos esa mitad, volteamos la copia y la traducimos por la longitud de la cápsula:
mitades

Vinculamos la mitad superior e inferior:
cápsula

El trabajo real (algo) duro proviene de la trigonometría que se necesita para hacer una esfera. El conjunto de todos los vértices que pertenecen a una esfera UV se puede describir como el conjunto de todos los puntos de la forma:

puntos

donde R es el radio de la esfera y, para un cierto número entero positivo N , tenemos la constante

θ = × π / N ,

k y n son números enteros con k variando de 0 a 2N-1 y n varía de -N / 2 a + N / 2 .

Para hacer una media esfera o un octavo de esfera, debe restringir el conjunto de valores tomados por k y n .

Si k fueran números reales y no solo números enteros, obtendría una esfera completa, no solo los vértices en su superficie. Entonces, lo que hemos hecho aquí es rasterizar la ecuación de la superficie de la primitiva .

El temible toro : ¡es fácil después de todo lo que hemos visto!

Nuevamente, más trigonometría, más vértices, más cuádriceps, más simetrías, más invariantes ... ¡más geometría! Encuentre la ecuación para la superficie de un toro, "rasterícela" correctamente, simplifique el problema usando las simetrías (obvias) del toro y, finalmente, recorra el conjunto de vértices que acaba de definir y haga los bordes y las caras como usted ¡Vamos!

¿Ver? Completamente sencillo.

jrsala
fuente
Guau. Gracias amablemente por una respuesta tan detallada y por tantos ejemplos. No había considerado la idea de simplemente generar la mitad de una esfera y reflejar los elementos simétricos. Muchas gracias por tomarse el tiempo para escribir esto de una manera que pueda entender fácilmente y espero poner en práctica con facilidad.
CaptainRedmuff
¡De nada! Lamento que no haya código.
jrsala
El esquema de los métodos era más de lo que realmente necesitaba. Puedo comenzar a elaborar un plan de acción a partir de ahí al menos:] ¿No creo que tenga información sobre Cajas / Cubos con bordes biselados? docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/…
CaptainRedmuff