¿Alguien puede explicar el doble contorno?

9

He estado tratando de entender el renderizado de vóxel y he estado viendo contornos dobles (DC).

Hasta ahora entiendo esto:

  1. Ejecute una función de densidad para un conjunto de puntos de cuadrícula (es decir, función de ruido)
  2. Encuentra qué aristas en el ceñidor contienen cambios entre los puntos finales
  3. A partir de estos bordes, cree puntos de intersección (es decir, vectores)

Ahora aquí es donde estoy atascado, el siguiente sería generar normales, pero ¿cómo? Al mirar este tema, esta imagen normalmente aparece.

                                                   Una cuadrícula firmada con bordes etiquetados por datos de Hermite

Hacer una investigación indica que las normales se generarían a partir de una isosuperficie. ¿Es correcto pensar que paso del ruido a la isosuperficie a lo normal? Si es así, ¿cómo lograría cada paso?

A mi entender, el siguiente paso sería el siguiente del documento de DC ;

Para cada borde que exhibe un cambio de signo, genere un quad que conecte los vértices de minimización de los cuatro cubos que contienen el borde.

¿Esta cita está representada por la imagen de arriba?

Finalmente, el siguiente paso sería ejecutar el QEF con los puntos de intersección y las normales y esto generaría mis datos de vértice. ¿Es esto correcto?

Jabonoso
fuente
Según entiendo este proceso, es algo así como ... ruido> nube de puntos> superficie iso> normales ... pero no soy lo suficientemente inteligente como para afirmar que puedo explicar este proceso correctamente, así que no voy a intentar una respuesta.
Guerra

Respuestas:

3

Las normales se generarían en función del gradiente de la función de densidad al mismo tiempo que se obtienen los puntos de intersección entre los bordes y la superficie. Si es algo simple y de forma cerrada como una esfera, entonces puede calcular las normales analíticamente, pero con el ruido deberá tomar muestras.

Tienes los siguientes pasos en el orden incorrecto. Primero, genera un vértice para cada celda que exhibe un cambio de signo. El QEF que está minimizando es simplemente la distancia total a cada uno de los planos definidos por el punto de intersección / pares normales para esa celda. Luego camina a través de los bordes que exhiben cambios de signos y crea un quad usando los cuatro vértices adyacentes (que se garantiza que se generaron en el último paso).

Ahora, mi mayor obstáculo para implementar esto fue resolver el QEF. De hecho, se me ocurrió una solución iterativa simple que funcionará bien (por ejemplo) en una GPU en paralelo. Básicamente, comienzas el vértice en el centro de la celda. Luego, promedia todos los vectores tomados del vértice a cada plano y mueve el vértice a lo largo de ese resultado, y repite este paso un número fijo de veces. Descubrí que moverlo ~ 70% a lo largo de la resultante se estabilizaría en la menor cantidad de iteraciones.

jmegaffin
fuente
Digamos que tengo una celda / vóxel que sé que muestra un cambio de signo (es decir, un caso como MC), he ejecutado una función de ruido para cada 8 esquinas de la celda para encontrar su densidad. Lo que me cuesta entender es de esto, ¿cómo encuentro las variables x , n y p del QEF?
Jabonoso
x es la posición del vértice. Para cada punto de intersección tiene p (la posición) yn (la normal), que forman los planos de los que estaba hablando.
jmegaffin
p se encuentra al encontrar dónde el promedio ponderado de las dos densidades a lo largo del borde es cero. Luego calcula n tomando el gradiente de su función de densidad en p .
jmegaffin
Entonces, básicamente, para cada cubo calculo p y n para cada 12 bordes, y luego ejecuto el QEF para cada borde de celda p y n en x , que en su ejemplo está en el centro de un vóxel / celda para comenzar. Entonces, si cuatro celdas comparten el mismo borde, creo un quad que conecta cada cuatro celdas x ? ¿Y es el quad resultante mis datos poligonales?
Jabonoso
No todas las aristas tendrán una intersección, por lo que no necesariamente resuelve el QEF para 12 planos. ¡Aparte de eso lo tienes!
jmegaffin
1

Desde la lectura del documento hasta la página 2, parece que los pesos del volumen se almacenan en las esquinas de la cuadrícula en lugar de ser el peso del cubo en sí, como prefieren los algoritmos normales del estilo de los Cubos de Marcha. Estos pesos de esquina definen un punto entre el borde entre 2 esquinas donde hay un cambio de signo de esquina a esquina. Los bordes con cambios de signo también almacenan una normal para el borde, que es la línea en ángulo en su representación 2D en el OP. Esa información normal se define durante la creación del volumen (por cualquier herramienta de edición o método de creación de volumen de procedimiento que se esté utilizando), no después de que se genere la isosuperficie como se esperaría con un algoritmo de estilo de los Cubos de Marcha. Estos datos normales "establecen" que la línea / superficie que pasa por el punto debe tener el valor normal predefinido. En los casos en que los Cubos de marcha doblarían la línea en ese punto para emparejarse con otro punto en un borde adyacente, los Cubos de marcha extendidos y el Contorneado dual extienden la línea / superficie hacia afuera hasta que se cruza con la línea / superficie que pasa a través del punto en el borde adyacente que tiene un valor normal diferente. Esto permite crear esquinas afiladas a partir de los datos de volumen donde los algoritmos básicos de Cubos de marcha redondearían un poco la superficie. No entiendo muy bien cómo los QEF (funciones de error cuadrático) juegan en esto, excepto que parece que hacen que sea más fácil calcular el punto extendido dentro de un cubo donde se ubicará una esquina. Los cubos de marcha extendidos y el contorno doble extienden la línea / superficie hacia afuera hasta que se cruza con la línea / superficie que pasa a través del punto en el borde adyacente que tiene un valor normal diferente. Esto permite crear esquinas afiladas a partir de los datos de volumen donde los algoritmos básicos de Cubos de marcha redondearían un poco la superficie. No entiendo cómo los QEF (funciones de error cuadrático) juegan en esto, excepto que parece que hacen que sea más fácil calcular el punto extendido dentro de un cubo donde se ubicará una esquina. Los cubos de marcha extendidos y el contorno doble extienden la línea / superficie hacia afuera hasta que se cruza con la línea / superficie que pasa a través del punto en el borde adyacente que tiene un valor normal diferente. Esto permite crear esquinas afiladas a partir de los datos de volumen donde los algoritmos básicos de Cubos de marcha redondearían un poco la superficie. No entiendo cómo los QEF (funciones de error cuadrático) juegan en esto, excepto que parece que hacen que sea más fácil calcular el punto extendido dentro de un cubo donde se ubicará una esquina.

Tenga en cuenta que he estado hablando de líneas y bordes aquí en el sentido 2D como se muestra en la representación en el OP. Tendría que leer un poco más y pensar para extender esto a 3D para la generación de mallas volumétricas.

Para abordar la segunda mitad de su pregunta sobre cómo generar las normales, y pensar desde un punto de vista de procedimiento impulsado por el ruido, parece que llenaría su volumen con datos de ruido y luego buscaría bordes con cambios de signos, luego examinaría los 4 cubos que comparten el borde para averiguar dónde se generarán los triángulos y calculan el vértice normal como lo harías para cualquier otra intersección de triángulos múltiples, tomando el promedio de las normales para cada triángulo que comparte el vértice. Esto es muy especulativo por mi parte, ya que el artículo trata principalmente de operaciones CSG y volúmenes generados a partir de mallas convertidas por escaneo, las cuales tienen normales bien definidas en las superficies.

Espero que al menos la primera parte de esta respuesta aborde las diferencias en cómo se representan y usan los datos de peso de una manera bastante diferente de los Cubos de Marcha básicos, y por qué los datos normales deben crearse bastante temprano en el proceso de generación de volumen, donde con los cubos básicos de marcha, los normales normalmente se crean como una última etapa en el proceso de generación de malla.

Ascensión
fuente