2009-04-22 9 views
6

Actualmente estoy escribiendo un programa para implementar Marching Cube usando C++ y Opengl.Marching Cube Pregunta

Sin embargo, mi mejor referencia es sólo de http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

en la web, los códigos proporcionados están escritos en C
mi problema aquí es que no entiendo el titulable y edgeTable
y cómo están relacionados.

¿alguien me puede ayudar en la explicación o guiarme en la conversión del algoritmo en códigos?

Respuesta

12

Estas tablas se utilizan para encontrar la manera de tesselate la superficie:

La primera tabla le da los bordes necesario interpolar. La segunda tabla le da la forma en que tiene que teselar, es decir, qué triángulos debe hacer dentro del cubo.

Un pequeño ejemplo:

vamos a suponer, el vértice de uno y 2 están por debajo del nivel de ISO, la cubeindex debe ser 3.

Toda la intersección debe ser similar una cuña.

Si se piensa en ello, usted tiene que interpolar los valores en los bordes: 0 y 9, y 2 y 10. Si introduce esto en un campo de bits, cada bit corresponde a "es intersectado borde?" usted terminaría con algo como esto:

 
10 9 8 7 6 5 4 3 2 1 edge 
1 1 0 0 0 0 1 0 1 0 intersected? 

¿no es así?

¿Qué es exactamente el valor de edgeTable [3] en binario;) 0x30A = 1100001010

Ahora se puede escribir una función que interpola linealmente los puntos en los bordes para adaptarse a su isolevel. Estos puntos se convertirán en su superficie dentro de esta celda.

¿Pero cómo teselar esta célula/superficie?

si nos fijamos en titulable [3] una sonrisa debe arrastrarse sobre su cara :)

los hu después de la declaración de perplejidad residual en comentario: ;-)

Lo que hace Marching Cubes: Imagine que tiene una habitación oscura con una fuente de luz en un punto. Es el centro de un campo de intensidad de luz volumétrica de valores de intensidad escalar. Puede ir al punto (x, y, z) y medir la intensidad allí, p. Ej. 3 candelas.

Ahora desea renderizar una superficie a través de todos los puntos que tienen una cierta intensidad de luz. Puede imaginarse que esta Isosuperficie se vería como una esfera alrededor de la fuente de luz puntual. Eso es lo que esperamos que los cubos de marcha nos proporcionen.

Ahora, recorrer todos los puntos de la sala y marcar cada punto como un vértice que tiene aproximadamente el valor iso, será algorítmicamente muy complejo y daría como resultado un número enorme de vértices.Que tendríamos que teselar de alguna manera.

Por lo tanto: First Marching cubes diseña todo el volumen en cubos del mismo tamaño. Si los datos subyacentes tienen algún tipo de discreción subyacente, se utilizan múltiplos de eso. No entraré en el otro caso, ya que es raro. Por ejemplo, ponemos una cuadrícula con la densidad de 1 mm en una habitación de 2mx5mx5m

Utilizamos cubos de 5mmx5mmx5mm. Pasar por ellos debería ser mucho más barato.

Puede imaginar ahora que los bordes de algunos de los cubos se cruzan con la isosuperficie. Estos son los interesantes. Este código identifica ellas:

cubeindex = 0; 
    if (grid.val[0]

si se mantiene cubeindex cero, este cubo en particular no es cruzada por el isosuperficie. Si cubeindex es> 0, ahora sabe que la isosuperficie pasa por este cubo y desea representar la parte de la isosuperficie que está dentro de ella.

Imagine esto en su mente. Ver http://en.wikipedia.org/wiki/Marching_cubes para ver ejemplos de cubos intersecados.

Los vértices que podría obtener fácilmente son aquellos en los bordes del cubo. Simplemente interpola linealmente entre 2 puntos de esquina para encontrar la posición del isovalor y pon allí un vértice. ¿Pero qué bordes se cruzan? Esa es la información en edgeTable [cubeindex]. Esa es la gran pieza de código con todos los ifs, que almacena los puntos interpolados como vértices en una matriz de puntos xyz: vertlist []. Esta pieza es el siguiente:

 
get the bitfield = edgeTable[cubeindex] 
if edge 1 is marked in bitfield (bit 1 set to 1 in bitfield) 
    vertlist[0] = interpolated point, somewhere on edge 1 
... and so on. 

se dispone de una amplia gama de vértices, pero la forma de conectarlos a los triángulos? Esa es una información que proporciona tritablemente.

El resto es más o menos lo que expliqué anteriormente.

Bueno, si todavía hay problemas, por favor sea específico acerca de la pieza de código que le da problemas.

+2

Si esa sonrisa no quiere suceder, piense en cómo colocaría los triángulos allí y luego compare eso con la propuesta en triTable. ¡Diviértete! ;-) – AndreasT

+0

hey gracias, AndreasT en realidad estoy un poco perdido. para su información, no tengo conocimiento sobre el algoritmo. entiendo cómo funciona triTable ahora, sin embargo, todavía no entiendo cómo funciona edgeTable y cómo determinar qué superficie usar ... – noob88

+0

bien, ahora la cosa se puso realmente grande :) – AndreasT