/ / Qual è l'uso del metodo getNormals () in TriangleMesh JavaFX - javafx, javafx-2, javafx-8, normal, javafx-3d

Che cosa è l'uso del metodo getNormals () in TriangleMesh JavaFX - javafx, javafx-2, javafx-8, normal, javafx-3d

Attualmente sto lavorando all'applicazione JavaFX 3D e ho incontrato il metodo getNormals () nella classe TriangleMesh.

Come nella classe TriangleMesh, viene utilizzato per creare oggetti Java FX 3D definiti dall'utente e in quello
getPoints () è usato per aggiungere punti
getFaces () è usato per aggiungere facce
getTexCoords () è usato per gestire Texture di oggetti 3D,
ma non sono sicuro di cosa sia l'uso del metodo getNormals () nella classe TriangleMesh.

Nella classe TriangleMesh, possiamo impostare il formato vertice su VertexFormat.POINT_TEXCOORD e VertexFormat.POINT_NORMAL_TEXCOORD.
Ma se impostiamo vertexFormat come "VertexFormat.POINT_NORMAL_TEXCOORD", allora dobbiamo aggiungere indici di normali nei volti come di seguito:
[ p0, n0, t0, p1, n1, t1, p3, n3, t3, // Primo triangolo di un rettangolo con texture

p1, n1, t1, p2, n2, t2, p3, n3, t3 // Secondo triangolo di un rettangolo con texture ]

come descritto in https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html

Non ho trovato alcuna differenza nella forma 3D, se avessi usato vertexFormat come POINT_TEXCOORD o POINT_NORMAL_TEXCOORD.

Quindi, qual è l'uso del metodo getNormals () in TriangleMesh JavaFX?

Grazie in anticipo..

risposte:

3 per risposta № 1

Uso delle normali in computer grafica:

Il normale è spesso usato in computer grafica perdeterminare l'orientamento di una superficie verso una fonte di luce per ombreggiatura piatta o l'orientamento di ciascuno degli angoli (vertici) per simulare una superficie curva con l'ombreggiatura Phong.


Le normali influenzano l'ombreggiatura applicata a una faccia.

Il meccanismo di ombreggiatura standard per JavaFX 8 è Phong Shading e a Phong Reflection Model. Per impostazione predefinita, Phong Shading assume un aspetto uniformevettore normale di superficie variabile (linearmente interpolato). Questo ti permette di avere una sfera resa dall'ombreggiatura con la geometria dei vertici limitata fornita. Di default il vettore normales sarà calcolato come perpendicolare alle facce.

Ciò che JavaFX consente è che tu ti fornisca il tuole normali piuttosto che fare affidamento su quelle calcolate di default. L'implementazione dell'algoritmo di shading di Phong in JavaFX interpolerà quindi tra le normali che fornite piuttosto che le normali che calcola. Cambiando la direzione delle normali della superficie cambierà il modello di ombreggiatura alterando il modo in cui il modello rappresenta la luce che rimbalza da esso, essenzialmente la luce rimbalzerà in una direzione diversa con una normale modificata.

Questo esempio di Wikipedia mostra un phong ombreggiatosfera a destra. Entrambe le sfere hanno in realtà la stessa geometria. La distribuzione delle normali che contribuiscono all'equazione di phong shading è quella predefinita, uniformemente interpolata basata su un normale calcolo standard per ogni faccia (quindi nessuna norma utente fornita). L'equazione utilizzata per calcolare l'ombreggiatura è descritta nel PhongMaterial javadoc, e puoi vedere il normale contributo all'algoritmo di ombreggiatura, in termini sia dei calcoli del colore diffuso che delle luci speculari.

ombreggiatura phong

Modelli 3D standard, come file obj può facoltativamente consentire di fornire le normali:

vn i j k

Dichiarazione geometrica poligonale ea forma libera.

Specifica un vettore normale con le componenti i, j e k.

Le normali dei vertici influenzano l'ombreggiatura uniforme erendering della geometria. Per i poligoni, le normali dei vertici vengono utilizzate al posto della faccetta effettiva normali. Per le superfici, le normali dei vertici sono interpolate su intera superficie e sostituire la normale superficie analitica normale.

Quando sono presenti le normali dei vertici, sostituiscono i gruppi di smoothing.

i j k sono le coordinate i, j e k per il vertice normale. Essi sono numeri in virgola mobile


Quindi, perché lo vuoi?

Il modo più semplice per spiegare potrebbe essere quello di guardare qualcosa di conosciuto come gruppi leviganti (clicca sul link, non ho inserito qui a causaal diritto d'autore). Come si può vedere dall'immagine collegata, quando il gruppo levigante è applicato ad una collezione di facce è possibile ottenere una delineazione nitida (ad esempio una piega o un angolo) tra le facce raggruppate. Specificare le normali ti consente di ottenere una cosa simile a un gruppo di smoothing, solo con un maggiore controllo perché puoi specificare singole normali per ciascun vertice piuttosto che un gruppo complessivo di facce correlate. Nota JavaFX consente di specificare i gruppi di livellamento tramite getFaceSmoothingGroups () per i casi in cui non vuoi passare alla difficoltà di definire la geometria normale completa tramite getNormals ().

Un'altra idea simile è a mappa normale (o bump map). Tale mappa memorizza le normali informazioni in un'immagine piuttosto che come informazioni vettoriali, come ad esempio getNormals () metodo, quindi è una cosa leggermente diversa. Ma puoi vedere un'interazione simile con l'algoritmo del modello di riflessione:

mappa normale

Lettura di sfondo - Come capire Phong Materials (e altre cose)