2015-08-24 9 views
11

Sto lavorando ad alcune grafiche di rendering, ho un modello come questo, sto usando strumenti di tela Java e finestre, altrimenti scritto in modo indipendente.Poligoni rettangolari di ordinamento della profondità, tutte le parti degli assi del modello che si affacciano

3d-frame model

Tutte le parti sono o poligoni rettangolari o line-segmenti. Come accade in questo modello, tutte le parti poligonali sono allineate con i piani x, yo z, l'origine xy che corre dall'angolo anteriore del modello nell'immagine. (è possibile distinguere la suddivisione rettangolare dei lati osservando da vicino il modo in cui appaiono rattoppati insieme, ma eliminare questo artefatto non viene affrontato qui)

Non ho trovato una tecnica per ottenere una profondità pulita -sorting, questo è basato sul vertice più lontano. Ho provato alcune tecniche ingenue e hanno tutti vari artefatti. Ho notato il partizionamento dello spazio binario e l'algoritmo di Newell senza scavare, ma ho la sensazione che ci dovrebbe essere un modo più semplice in questo caso, in particolare con la condizione che tutte le parti siano allineate a destra e parallele agli assi. Eventuali suggerimenti su modi su di esso apprezzato

Aggiornamento

mi è venuta in mente questa idea che potrebbe avere qualcosa in corso per questo

comparison of rectangular polygons

Data la piana di fronte a vincolo, ci sono 6 possibili relazioni, (piano xx), (piano xy), (piano xz), (piano yy), (piano yz) e (piano zz).

È facile ordinare due poligoni se condividono lo stesso piano, le altre 3 combinazioni sono mostrate sopra (xy su xz), (xy su yz) e (xz su yz), con diverso ordine di profondità che può si verificano.

Sto pensando la mia condizione di confronto potrebbe andare qualcosa come questo, dato P1 = polygon1 e P2 = polygon2

if (P1 == xy_plane) return min(P1.z, P2.z) 
if (P2 == xy_plane) return min(P2.z, P1.z) 
if (P1 == xz_plane) return min(P1.y, P2.y) 
if (P2 == xz_plane) return min(P2.y, P1.y) 

P1 o P2 devono trovarsi in uno dei primi due piani, quindi per dichiarazione problema dovrebbe essere sufficiente, necessario confermare se questo approccio funziona

Update2

ho avuto qualche progresso lungo l'idea di cui sopra, e sembra che l'ordinamento sulla corrispondenza poligono sta facendo qualcosa di inte riposando, ha funzionato parzialmente, direi che sembra facile, ma ... beh, spero che tu pensi che sia e possa dirmi cosa devo fare.

Lungo la linea sopra, prima di tutto contrariamente a quanto suppongo, i poligoni nello stesso piano non sono banali, possono avere diverse configurazioni mostrate qui; parallelo e non condividere un altro asse come nei primi due, o parallelo e sullo stesso piano. Questo a volte significa che a loro non importa quali assi scelgono (per un confronto a coppie), (e parla di un lato più profondo di questa ricerca).

polygons on the same plane

Impostazione di una serie di istruzioni condizionali a prescindere, qualcosa sulla falsariga del suggerimento di cui sopra, che aveva un sapore di forza bruta, con una nutrita serie di "if-else", penso che alla fine ho trovato un corretto confronto tra poligoni a coppie e poligoni, in modo che in questa nozione si possa dire certamente se il soggetto o l'altro è il più vicino.

Lavorando su un solo lato del modello qui, è riuscito a produrre qualcosa che sembra abbastanza convincente. Il processo in generale si sente vicino a bloccarsi, ma cercare di liberarsi di qualche disallineamento finale in qualche modo provocatorio, mentre le vecchie trivias fisiche che fissano una parte dall'altra si rompono sempre.

enter image description here

+0

Vuoi ordinare in relazione alla direzione della telecamera o solo a uno dei tre assi? – MooseBoys

+3

Considera 3 triangoli, in cui l'angolo superiore di ognuno è sopra la sezione larga di uno degli altri. Facile da visualizzare, ma solo un buffer di profondità può risolverlo. Detto questo, potrebbe esserci solo una soluzione per il tuo caso limitato. – usr2564301

+0

Mi piacerebbe relativo alla fotocamera, come nella vista sopra, sto usando un punto focale A, spesso l'origine, e una fotocamera mobile, vettore C.Stavo pensando, ma non sono arrivato a un metodo, che se la telecamera è su uno degli otto xyz ottanti, gli aerei avrebbero una preferenza lungo ciascuno degli assi + ive o -ive, l'ordinamento su uno di questi spesso dà risultati ragionevoli, ma non completamente puliti, ancora – area5one

risposta

5

Lasciatemi aggiungere alcune osservazioni:

Le condizioni che

  • tutti i lati del poligono sono paralleli ad un asse e che
  • i poligoni non si intersecano

non sono abbastanza per garantire l'esistenza di un ordinamento globale della profondità dei poligoni - come si può vedere con questo esempio di tre rettangoli:

depths interleaving

Inoltre dell'ordine profondità relativa di due oggetti può dipendere da altri oggetti come si può vedere in questo esempio 2D, dove l'ordine profondità degli oggetti A e B, che non si nascondono a vicenda, dipende la posizione dell'oggetto C:

enter image description here

Quindi andando a fare una cernita di profondità globale degli oggetti non sembra essere la strada da percorrere.

0

soluzione del problema generale, dove i lati non sono generalmente paralleli agli assi, può essere più facile.

Calcolare la linea di intersezione (chiamarla L) dei piani contenenti le 2 facce. Ora, supponendo che le facce non si intersechino, ciascuna faccia sarà interamente su un lato di L.

Ora trova un vettore V perpendicolare a L, che passa attraverso la telecamera. La faccia visibile è quella che si trova ad un angolo inferiore rispetto a V. È possibile confrontare gli angoli usando alcuni prodotti incrociati e prodotti punto.

È possibile semplificare molto questo caso per il caso da parallelo a asse (trovare L e V è banale).

Per i segmenti di linea, utilizzare un piano arbitrario contenente la linea dovrebbe funzionare.

Per facce complanari, non importa, perché non si oscurerà mai l'altro.

È necessario il caso speciale il caso di faccia parallela.

Questo algoritmo è O (N^2) nel numero di facce, È necessario effettuare confronti a coppie. Usare il buffer di profondità come suggerito da qualcuno potrebbe essere più praticabile se si hanno molti volti.