Pregunta

Estoy creando un renderizador de lienzo 3D HTML5, y diría que me he vuelto muy lejos sin la ayuda de también, pero me he encontrado con una especie de showstopper. Estoy tratando de implementar la compasión de la función de remuneración 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 3D acelerado.

En cualquier caso, ya que estoy girando el cubo, he encontrado que las caras equivocadas están siendo ocultas. Ejemplo:

Backface Culling Problema 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. Crear una matriz de transformación por la cual transformar los vértices del cubo

  2. Para cada cara, y para cada punto en cada cara, los convierto a VEC3s, y los multiplicarlos por la matriz realizada en el Paso 1.

  3. i Luego, la superficie está normal de la cara con el método de Newell, luego obtenga un producto DOT de esa normal y algunos componentes VEC3, por ejemplo, [-1, 1, 1], ya que no pude T Piense en un buen valor para poner aquí. He visto a algunas personas usan la posición de la cámara para esto, pero ...

  4. saltando la etapa habitual de usar una matriz de cámara, tire de los valores de X e y de los vectores resultantes para enviar a mis renderizadores de línea y cara, pero solo si tienen un producto de punto por encima de 0. Me doy cuenta Es bastante arbitrario, cuáles tire, realmente.

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

    Probablemente no importa, pero la Biblioteca Matrix que estoy usando es GL-Matrix:

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

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

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

    ¡Gracias de antemano!

¿Fue útil?

Solución

No he revisado todo su sistema, pero el "VEC3" no debe ser arbitrario; Debe 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 las handsness y los ejes de la pantalla del sistema de coordenadas. No tiene una "matriz de cámara" explícita (que generalmente se llama matriz de visualización), pero su cámara (vista y proyección) está definida implícitamente por su proyección Paso 4!

Sin embargo, tenga en cuenta que este enfoque solo funcionará para las proyecciones ortográficas, no las perspectivas (consideren una cara en el lado izquierdo de la pantalla, frente a la derecha y paralela a la dirección de la vista; El producto DOT sería 0 pero debería ser visible). El enfoque habitual, utilizado en el hardware real 3D, es para hacer primero toda la transformación (incluida la proyección), luego verifique si el triángulo 2D resultante es de izquierda o en el sentido de las agujas del reloj, y mantenga o deseche en función de esa condición.

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