Pregunta

Estoy intentando crear una representación 3D interactivo de las células que están definidos por la intersección de superficies arbitrarias. Estoy teniendo dificultades para encontrar la manera de crear una malla de esta (o hay algo mejor que una malla que debe ser el objetivo de representar volúmenes 3D?). Cada superficie de s está dada por una expresión analítica para un avión, esfera, cilindro, cono, etc. como s = f (x, y, z) = 0, como los que aquí:

introducir descripción de la imagen aquí

Para cada celda I tiene una lista de superficies y un +/- sentido para cada superficie. Con esto, es fácil determinar si un x, y, mentiras punto z dentro de la célula por taponamiento de ese punto en la ecuación para cada una de las superficies que limitan, y si el resultado es + para todas las superficies + y - para todos - superficies el punto mentiras en el interior. Obviamente, si el resultado es cero para cualquier superficie entonces los punto se encuentra en esa superficie.

I puede probar miles de puntos de la cuadrícula, señalando para cada celda esos puntos que están dentro de esa célula y a continuación, utilizando el más exterior de estos puntos para crear una malla para esa célula. Sin embargo, tengo miles de células y esto simplemente no sería lo suficientemente rápido. Muchas células están proporción muy pequeña o baja en comparación con otros, por lo que necesitaría una muy fina malla de puntos si iba a hacerlo de esta manera.

Puede alguien sugerir una manera eficaz de poner celdas definidas de esta manera en un modelo 3D estática? ¿Hay algún tipo de biblioteca que funciona con este tipo de especificación de la geometría que puede construir mallas 3D para mí? Me estoy perdiendo algo obvio?

Gracias, Nick

¿Fue útil?

Solución

Como un problema general, esto es bastante difícil: yo creo que es básicamente un problema general de programación no lineal. Si sus límites son generados por funciones arbitrarias, puede haber un número arbitrario de células delimitadas por incluso una tal función; Sin más información acerca de las funciones, no creo que se puede hacer mejor que el control de puntos de la rejilla.

Si usted sabe algo acerca de su función (por ejemplo, plano, esfera, cilindro, cono y son todas las cónicas), que puede ser capaz de hacerlo mejor. En cualquier caso, es posible que desee comenzar con un enfoque combinatorio; por ejemplo, teniendo en cuenta las 3 fronteras, determinar si hay algún punto donde se cruzan los tres.

En cualquier caso, una vez que identificar las esquinas y los bordes de la célula, se puede utilizar un enfoque basado en rejilla para construir una pantalla de malla de - por ejemplo, cortar su superficie con los planos de los ejes alineados, para determinar los vértices y triángulos a enviar a su biblioteca de gráficos 3D de elección.


Otra idea: dado que se está definiendo sus superficies por f(x,y,z)=0, se puede empezar con un montón de puntos, y numéricamente migrarlas en superficies cercanas con el paso de procedimiento o algo de un Newton:

point p = (x,y,z)
scalar value = f(p)
while abs(value) > epsilon:
  vector gradient = gradient_of_f(p)
  p -= gradient * (value / dot(gradient,gradient))
  value = f(p)

Algo similar debe permitir que a los puntos de bordes y esquinas aproximados. Puede ser que sea más difícil de encontrar la manera de conectar este tipo de puntos en una malla, aunque ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top