Come trovare le curve di livello per l'algoritmo di rimozione delle linee nascoste di Appel


10

Per divertimento sto cercando di creare un visualizzatore wireframe per DCPU-16 . Capisco come fare tutto tranne come nascondere le linee che sono nascoste nella cornice del filo. Tutte le domande qui su SO presumono che tu abbia accesso a OpenGL, sfortunatamente non ho accesso a nulla di simile per il DCPU-16 (o qualsiasi tipo di accelerazione hardware).

Ho trovato una descrizione abbastanza buona dell'algoritmo di Appel su Google Libri . Tuttavia, c'è un problema che non riesco a capire.

Appel ha definito la linea di contorno come un bordo condiviso da un poligono frontale e posteriore, o un bordo non condiviso di un poligono frontale che non fa parte di un poliedro chiuso. Un bordo condiviso da due poligoni rivolti in avanti non provoca alcun cambiamento di visibilità e quindi non è una linea di contorno. In Fig. 8.4, i bordi AB, EF, PC, GK e CH sono linee di contorno, mentre i bordi ED, DC e GI non lo sono.

Fig. 8.4

Capisco le regole dell'algoritmo e come funziona una volta che hai le tue curve di livello, tuttavia non capisco cosa devo fare per determinare se un bordo è " condiviso da un poligono frontale e posteriore, oppure bordo non condiviso di un poligono frontale che non fa parte di un poliedro chiuso "dal punto di vista della codifica. Riesco a guardare una forma e so quali sono le linee di contorno nella mia testa, ma non ho idea di come trasferire questa "comprensione" in un algoritmo codificato.


Aggiornare

Ho compiuto alcuni progressi nel determinare le curve di livello. Ho trovato questi due appunti di una lezione della University of Buffalo sulla computer grafica.

inserisci qui la descrizione dell'immagine

Considera i bordi. Questi rientrano in tre categorie.

  1. Un bordo che unisce due facce invisibili è di per sé invisibile. Questo verrà eliminato dall'elenco e ignorato.
  2. Un bordo che unisce due facce potenzialmente visibili è chiamato "bordo materiale" e richiederà un'ulteriore elaborazione.
  3. Un bordo che unisce una faccia potenzialmente visibile e una faccia invisibile è un caso speciale di un "bordo materiale" ed è anche chiamato "bordo di contorno".

Utilizzando le due informazioni di cui sopra sono in grado di avvicinarmi alla possibilità di scriverlo come codice, ma ho ancora molta strada da fare.



1
Controlla questa risposta sul calcolo del triangolo normale. Il prodotto a punti del vettore normale con il vettore della linea di vista determina se un triangolo è rivolto in avanti.

Risposte:


3

Affinché la regola "-facing" sia valida, è necessario assicurarsi che tutte le facce siano orientate correttamente. Ad esempio, utilizzare la regola della mano destra, ciò significa che i vertici di una faccia devono essere numerati in modo tale che una rotazione positiva nel piano della faccia corrisponda a un normale puntamento esterno al poliedro. (Capito?) O più semplicemente, ogni faccia deve venire con la sua normale rivolta verso l'esterno.

Le facce pendenti, cioè non appartenenti a un poliedro chiuso, possono essere viste con un orientamento indeterminato.

Ora calcolare le parti di un bordo che sono nascoste da un poligono di contorno è il corso principale. Questo problema è molto simile a quello del ritaglio di un segmento di linea da una finestra poligonale in 2D. Innanzitutto considera la linea di supporto del segmento di linea e trova le intersezioni con il poligono. Utilizzando una regola di parità, è possibile determinare facilmente le parti all'interno e all'esterno del poligono.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.