Domanda

Sto creando un rendering 3D su tela HTML5, e direi che ho avuto abbastanza lontano senza l'aiuto di così, ma ho incontrato uno showstopper di tipi. Sto cercando di implementare il backface che si abbassa su un cubo con l'aiuto di alcuni calcoli normali. Inoltre, ho taggato questo come WebGL, in quanto questa è una questione abbastanza generale che potrebbe essere applicata sia al mio caso di utilizzo che a una 3D-accelerata.

Ad ogni modo, come sto ruotando il cubo, ho scoperto che i volti sbagliati sono nascosti. Esempio:

backface rubinetto problema su un cubo

Sto usando i seguenti vertici: https://developer.mozilla.org/en/webgl/creating_3d_objects_using_webgl#Define_the_positions_of_the_cube% 27s_vverices

La procedura generale che sto usando è:

    .
  1. Crea una matrice di trasformazione con cui trasformare i vertici del cubo

  2. Per ogni faccia, e per ogni punto su ciascuna faccia, lo convertono questi in VEC3S, Andn li moltiplicano con la matrice effettuata al punto 1.

  3. Quindi ottengo la superficie normale del viso usando il metodo di Newell, quindi ottieni un punto di punto da quel normale e alcuni truck-up vec3, ad esempio, [-1, 1, 1], dal momento che non potrei Pensa a un buon valore da mettere qui. Ho visto alcune persone usa la posizione della fotocamera per questo, ma ...

  4. Saltando la solita fase di utilizzo di una matrice di fotocamera, tiro i valori X e Y dai vettori risultanti da inviare alle mie linee e affrontare i rendering, ma solo se hanno un punto di riferimento sopra. 0. Mi rendo conto È piuttosto arbitrario quali ti fermo, davvero.

  5. Mi chiedo due cose; Se la mia procedura nel passaggio 3 è corretta (molto probabilmente non è probabile), e se l'ordine dei punti che sto disegnando sui volti non è corretta (molto probabile). Se quest'ultimo è vero, non sono sicuro di come visualizzare il problema. Ho visto persone dire che le normali non sono pertinenti, che è la direzione in cui viene disegnata la linea, ma ... è difficile per me avvolgere la mia testa a riguardo, o se questa è la fonte del mio problema. Probabilmente non importa, ma la libreria di matrice sto usando è GL-Matrix:

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

    Inoltre, il particolare file nella mia base di codice open source che sto usando è qui:

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

    Grazie in anticipo!

È stato utile?

Soluzione

Non ho recensito il tuo intero sistema, ma il "trucco VEC3" non dovrebbe essere arbitrario; Dovrebbe essere il vettore "fuori dallo schermo", che (poiché la tua proiezione è ⟨ x , y , z ⟩ → ⟨ > x , y ⟩) è ⟨0, 0, -1⟩ o ⟨0, 0, 1⟩ a seconda della manuale del sistema di coordinate e degli assi dello schermo. Non hai una "matrice fotocamera" esplicita (che di solito viene chiamata matrice di vista), ma la fotocamera (vista e proiezione) è implicitamente definita dalla proiezione del tuo passaggio 4!

Tuttavia, si noti che questo approccio funzionerà solo per le proiezioni ortografiche, non quelle prospettiche (considerano una faccia sul lato sinistro dello schermo, rivolto verso destra e parallelo alla direzione di vista; il prodotto DOT sarebbe 0 ma dovrebbe essere visibile). L'approccio abituale, utilizzato nell'hardware 3D effettivo, è quello di eseguire prima tutta la trasformazione (inclusa la proiezione), quindi controllare se il triangolo 2D risultante è in senso antiorario o in senso orario, e mantieni o scarto in base a tale condizione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top