2009-04-23 21 views
6

de mi última pregunta: Marching Cube Question
¿Implementando el algoritmo del cubo de marcha?

Sin embargo, soy todavía no está claro como en:

  1. cómo crear imaginario cubo/voxel para comprobar si un vértice está por debajo del isosuperficie?
  2. ¿cómo sé qué vértice está debajo de la isosuperficie?
  3. ¿cómo determina cada cube/voxel qué cubeindex/surface usar?
  4. cómo dibujar la superficie usando los datos en triTable?

Digamos que tengo datos de una nube de puntos de una manzana.
¿cómo procedo?

¿alguien que esté familiarizado con Marching Cube me puede ayudar?
solo conozco C++ y opengl. (C está un poco fuera de mi alcance)

Respuesta

1

1) Depende de la implementación de yoru. Tendrá que tener una estructura de datos donde pueda buscar los valores en cada esquina (vértice) del voxel o cubo. Puede ser una imagen en 3D (es decir, una textura 3D en OpenGL), o puede ser una estructura de datos de matriz personalizada o cualquier otro formato que desee.

2) Debe comprobar los vértices del cubo. Hay diferentes optimizaciones sobre esto, pero en general, comience con la primera esquina, y simplemente verifique los valores de las 8 esquinas del cubo.

3) La mayoría de los algoritmos (rápidos) crean una máscara de bits para usar como una tabla de búsqueda en una matriz estática de opciones. Solo hay tantas opciones posibles para esto.

4) Una vez que haya creado los triángulos de triTable, puede usar OpenGL para representarlos.

Digamos que tengo datos de una nube de puntos de una manzana. ¿Cómo procedo?

Esto no va a funcionar con los cubos de marcha. Marchar cubos requiere datos de voxel, por lo que necesitaría usar algún algoritmo para poner la nube de puntos de datos en un volumen cúbico. Gaussian Splatting es una opción aquí.

Normalmente, si está trabajando desde una nube de puntos y desea ver la superficie, debería observar los algoritmos de reconstrucción de superficie en lugar de los cubos de marcha.

Si desea obtener más información, le recomiendo leer algunos libros sobre técnicas de visualización. Una buena es de la gente de Kitware - The Visualization Toolkit.

Es posible que desee echar un vistazo a VTK. Tiene una implementación en C++ de Marching Cubes, y está completamente abierto.

+0

puede un 6 glQuads igual a un voxel? en caso afirmativo, ¿cómo es la construcción de vóxeles reletive? ¿Mi punto es el centro del cubo? – noob88

+0

@ noob88: No, en realidad no. Su "cubo" debería ser un objeto compuesto por 8 pionts. Los 6 glQuads podrían ser las caras del cubo/vóxel, y los vértices que estás usando podrían ser tus 8 puntos. Sin embargo, crearía una estructura de datos diferente para contener esto. Algo tan simple como una matriz multidimensional funciona. –

+0

ya veo ... creo que necesito tiempo para ponerlo a prueba primero, ¿puedo tener su contacto? si tuviese más problemas, espero que pueda obtener su ayuda. – noob88

2

En primer lugar, la isosuperficie se puede representar de dos maneras. Una forma es tener los escalares isovalorados y por punto como un conjunto de datos de una fuente externa. Así es como funcionan las imágenes por resonancia magnética. El segundo enfoque es hacer una función implícita F() que toma un punto/vértice como su parámetro y devuelve un nuevo escalar.Considere esta función:

float computeScalar(const Vector3<float>& v) 
{ 
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z); 
} 

cual sería calcular la distancia entre el punto y el origen de todos los puntos en su campo escalar. Si la isovalor es el radio, simplemente descubriste una forma de representar una esfera. Esto es porque | v | < = R es verdadero para todos los puntos dentro de una esfera, o que vive en su interior. Solo averigua qué vértices están dentro de la esfera y cuáles están en el exterior. Desea utilizar operadores menores o mayores que porque un volumen divide el espacio en dos. Cuando sepa qué puntos de su cubo se clasifican como interiores y exteriores, también sabrá qué bordes interseca la isosuperficie. Puedes terminar con todo, desde ningún triángulo hasta cinco triángulos. La posición de los vértices de malla puede calcularse interpolando a través de los bordes intersecados para encontrar el punto de intersección real.


Si desea representar por ejemplo una manzana con campos escalares, que le sea necesario para obtener los datos de origen establecidas para enchufar a su aplicación, o utilizar una función implícita bastante compleja. Recomiendo obtener primitivas geométricas simples como esferas y toros para que funcionen primero, y luego expandir desde allí.

Cuestiones relacionadas