2011-04-04 26 views
5

Tengo un modelo 3D que consta de vértices de puntos (XYZ) y, finalmente, caras triangulares. Uso de OpenGL o cámara-vista-matriz-proyección Puedo proyectar el modelo 3D en un plano 2D, es decir, una ventana de vista o una imagen con una resolución m * n.Asignación desde la proyección 2D a la nube de puntos 3D

La pregunta es cómo puedo determinar la correspondencia entre un píxel del plan de proyección 2D y su correspondiente vértice (o cara) del modelo 3D original.

A saber,
¿Cuáles son los vértices más cercanos en el modelo 3D para un determinado píxel a partir de una proyección 2D?
Parece que se trata de un problema de OpenGL o raytracing. ¿Hay alguna solución fácil?

Con la idea del trazado de rayos, en realidad se trata de encontrar el primer vértice/cara intersectado con el rayo desde un punto de vista. ¿Alguien puede mostrarme algún tutorial o ejemplos? Me gustaría encontrar un algoritmo independiente del uso de OpenGL.

Respuesta

2

Las pruebas de detección en OpenGL generalmente se realizan sin raytracing. En cambio, a medida que se representa cada primitiva, se usa un plano en la salida para almacenar la ID única de la primitiva. La prueba de impacto es tan simple como leer el plano de identificación en la ubicación del cursor.

+0

Hi. ¿Podría por favor dar más detalles sobre esto? Tengo una nube de puntos 3D y cada punto tiene XYZRGB. Después de la proyección de la nube de puntos en la imagen, ¿puedo obtener su original (x, y, z) de las coordenadas de píxeles? Necesito la ubicación original de todos los píxeles. – Ankitp94

1

Mi (posiblemente ingenuo) pensamiento sería crear una matriz de vértices y luego ordenarlos por su distancia (o distancia-cuadrado, para la velocidad) una vez proyectado a su punto de pantalla. El primer elemento de la lista será el más cercano. Será O (n) para n vértices, pero no es peor.

Editar: Mejor para la velocidad y la memoria: simplemente recorre todos los vértices y realiza un seguimiento del vértice cuya proyección es la más cercana (distancia al cuadrado) a tu píxel de la ventana gráfica. Esto supone que puede realizar la proyección usted mismo, sin depender de OpenGL.

Por ejemplo, en pseudo-código:

function findPointFromViewPortXY(pointOnViewport) 
    closestPoint = false 
    bestDistance = false 
    for (each point in points) 
    projectedXY  = projectOntoViewport(point) 
    distanceSquared = distanceBetween(projectedXY, pointOnViewport) 
    if bestDistance==false or distanceSquared<bestDistance 
     closestPoint = point 
     bestDistance = distanceSquared 
    return closestPoint 
+0

El punto más cercano en la proyección 2D puede estar muy lejos en el espacio 3D. –

+0

@MikeDaniels No estoy seguro de lo que quieres decir. Sí, puede estar muy lejos en el espacio 3D desde la proyección en el avión, pero no creo que eso importe. Según tengo entendido, el OP tiene una nube de puntos en 3D representada en la pantalla, el usuario está haciendo clic en la pantalla para seleccionar un punto, y el OP está tratando de encontrar el punto más cercano (en la pantalla) al punto elegido. – Phrogz

+0

lo siento, no puedo entender su idea. ¿Qué tipo de distancia debo calcular y ordenar? – elgcom

1

Además de la respuesta de Ben Voigt:

  1. Si usted hace una lectura adicional sobre los objetos pickable, entonces se puede establecer la la ventana gráfica contiene solo un píxel que leerá.

  2. También puede codificar ID de triángulo utilizando el sombreador de geometría (gl_PrimitiveID).

Cuestiones relacionadas