opengl graphics directx coordinate-systems clipping

opengl - Por qué el recorte debe hacerse en CCS, no en NDCS



graphics directx (1)

Por qué el recorte debe hacerse en CCS, no en NDCS. Creo que es más fácil recortar en NDCS, pero muchos libros dicen que el recorte debe hacerse en CCS. Dan un ejemplo de que una línea se coloca sobre el ojo por detrás y por delante.

No pude entender por qué puede ser un problema.


La única diferencia entre las coordenadas del dispositivo normalizado (NDCS) y el espacio del clip (CCS) es que CCS está antes de la división de perspectiva y NDCS está después. La razón por la cual el recorte no funciona bien en NDCS es que la división de perspectiva mueve los puntos detrás del espectador al frente (ya que w contiene -z), por lo que los triángulos detrás del espectador no se recortarán correctamente en el plano frontal.

P: ¿Dónde está el espectador en NDCS? En VCS, la ubicación del espectador es el punto de origen [0,0,0,1]. Sin embargo, si calculo el punto de origen con la matriz de perspectiva, el resultado es extraño. La coordenada homogénea no es 1 sino 0. ¿Cómo podemos definir la posición del espectador en NDCS?

En NDCS y CCS no hay un punto de observación finito (y no estoy seguro de qué tiene que ver el espectador con el recorte). Uno tiene que pensar en ambos sistemas, ya que el view-frustum está deformado en un cubo (el plano cercano y el plano lejano tienen el mismo tamaño). En NDCS, el área visible está en [-1, 1] a lo largo de cada eje, mientras que en CCS está en [-w, w]. Ahora piense en el espectador: en el espacio de visión, el espectador (el centro de proyección) era ese punto donde se intersectaban todos los rayos que iban de una esquina del plano cercano a la esquina respectiva en el plano lejano. Cuando ahora deformamos el tronco truncado en un cubo, todos estos rayos son paralelos y ya no hay punto de intersección. Esto significa que el centro de proyección está infinitamente lejos, que se describe en el espacio proyectivo mediante vectores que tienen una coordenada homogénea de 0.

P: Sin embargo, el punto donde z> 0 siempre es mayor que 1 después de la conversión, y también se corta en NDCS. ¿Me equivoco? Si estoy equivocado, ¿puedes darme un ejemplo?

Básicamente tienes razón. Pero el recorte no ocurre en puntos únicos, el recorte ocurre en los bordes distribuidos entre estos puntos.

Supongamos que tenemos una línea que va de un punto dentro del tronco (A) a un punto detrás del espectador (B). En este caso, el recorte debe ocurrir en el plano cercano y la línea debe ir de A a B ''(la intersección de la línea con el plano cercano).

Si primero realizáramos la división de perspectiva, entonces (como anotó) A todavía se queda dentro del tronco, pero B se mapea a un punto detrás del plano lejano. Cuando ahora recortamos la línea entre esos puntos, obtenemos una línea que va de A a un punto B ''que está en el plano lejano. Obviamente, no queremos separarnos del espectador cuando la línea estaba pasando por el visor.