Eliminación ortográfica de la cara posterior en 3D mediante superficies normales

Estoy creando un renderizador 5D de lienzo HTML3, y diría que he llegado bastante lejos sin la ayuda de SO, pero me encontré con una especie de sensacional. Estoy tratando de implementar la selección de cara posterior en un cubo con la ayuda de algunos cálculos normales. Además, he etiquetado esto como WebGL, ya que esta es una pregunta lo suficientemente general que podría aplicarse tanto a mi caso de uso como a uno acelerado en 3D.

En cualquier caso, a medida que giro el cubo, descubrí que se ocultan las caras incorrectas. Ejemplo:

Problema de eliminación de cara posterior en un cubo

Estoy usando los siguientes vértices: https://developer.mozilla.org/en/WebGL/Creating_3D_objects_using_WebGL#Define_the_positions_of_the_cube%27s_vertices

El procedimiento general que estoy usando es:

  1. Cree una matriz de transformación mediante la cual transformar los vértices del cubo.

  2. Para cada cara, y para cada punto en cada cara, los convierto a vec3s, y luego los multiplico por la matriz hecha en el paso 1.

  3. Luego obtengo la superficie normal de la cara usando el método de Newell, luego obtengo un producto punto de esa normal y algunos vec3 inventados, por ejemplo, [-1, 1, 1], ya que no pude pensar en un buen valor para poner aquí. He visto a algunas personas usar la posición de la cámara para esto, pero...

  4. Saltándome el paso habitual de usar una matriz de cámara, extraigo los valores x e y de los vectores resultantes para enviarlos a mis renderizadores de líneas y caras, pero solo si tienen un producto punto por encima de 0. Me doy cuenta de que es bastante arbitrario cuáles tirar, de verdad.

Me pregunto dos cosas; si mi procedimiento en el paso 3 es correcto (lo más probable es que no lo sea), y si el orden de los puntos que estoy dibujando en las caras es incorrecto (muy probable). Si esto último es cierto, no estoy muy seguro de cómo visualizar el problema. He visto a gente decir que las normales no son pertinentes, que es la dirección en la que se dibuja la línea, pero... Es difícil para mí entender eso, o si esa es la fuente de mi problema.

Probablemente no importe, pero la biblioteca de matriz que estoy usando es gl-matrix:

https://github.com/toji/gl-matrix

Además, el archivo particular en mi base de código fuente abierta que estoy usando está aquí:

http://code.google.com/p/nanoblok/source/browse/nb11/app/render.js

Gracias de antemano!

preguntado el 29 de julio de 12 a las 00:07

1 Respuestas

No he revisado todo su sistema, pero el "vec3 inventado" no debería ser arbitrario; debería ser el vector "fuera de la pantalla", que (ya que su proyección es ⟨x, y, z⟩ → ⟨x, y⟩) es ⟨0, 0, -1⟩ o ⟨0, 0, 1⟩ dependiendo de los ejes de la pantalla y la lateralidad de su sistema de coordenadas. ¡No tiene una "matriz de cámara" explícita (que generalmente se llama matriz de vista), pero su cámara (vista y proyección) está implícitamente definida por su proyección del paso 4!

Sin embargo, tenga en cuenta que este enfoque solo funcionará para proyecciones ortográficas, no en perspectiva (considere una cara en el lado izquierdo de la pantalla, mirando hacia la derecha y paralela a la dirección de la vista; el producto punto sería 0 pero debería ser visible). El enfoque habitual, utilizado en el hardware 3D real, es primero hacer toda la transformación (incluida la proyección), luego verificar si el triángulo 2D resultante está enrollado en sentido antihorario o en sentido horario, y mantenerlo o descartarlo según esa condición.

Respondido 29 Jul 12, 05:07

Ah, sí, había probado algunos, pero no lo pensé bien. No puedo creer que fuera tan simple: un simple vector de 0, 0, 1 (o z: -1) hizo el truco. ¡Maldita sea! Gracias un montón. :) - Hunter

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.