Come raytrace le superfici di Bezier?


18

Ho provato questa domanda su math.SE e sorprendentemente, la risposta è stata "le equazioni sono troppo brutte, basta alimentare la funzione ad un cercatore di radici numerico". Ma se ti consideri "un ragazzo grafico" come me e hai giocato ampiamente con le curve di Bezier per il lavoro di progettazione, ho avuto modo di credere che si potesse fare di meglio. C'è un algoritmo pubblicato da Kajiya che non ho le basi per capire (Sylvester Matrices), ma i relativi consigli su matematica.SE erano che il risultato è un polinomio di grado 18 in t, e devi ancora risolverlo numericamente. Ho avuto un'altra idea con un risultato simile .

Quindi, è un sogno irrealizzabile sperare di risolvere algebricamente l'intersezione tra la superficie di Ray / Bezier, rendendo così possibile la codifica esplicita e una super-scorrevolezza superveloce?

A parte questo, qual è il metodo più veloce per eseguire questo calcolo? Riesci a "trovare le oscillazioni" per ottenere un limite stretto (e target) per la suddivisione ricorsiva? Se devi usare un cercatore di radici numerico (sospiro), di quali proprietà ha bisogno ed esiste la scelta migliore per la velocità?

Il mio pensiero originale era di prepararmi per una superficie specifica, simile all'espansione di Laplace come descritto nella risposta alla mia altra domanda di matematica sui triangoli . Ma sarei interessato anche ai metodi generali. Sto solo pensando a un insieme fisso di forme, come la teiera dello Utah . Ma sarei molto interessato ai modi per ottimizzare la coerenza temporale attraverso i frame animati.


Stai cercando un metodo generale che puoi applicare a una superficie di Bezier arbitraria o un modo per preparare un metodo rapido per una superficie specifica? La forma della tua superficie verrà fissata prima dell'esecuzione?
trichoplax,

1
Si noti che è possibile eseguire il raymarch di superfici più bezier molto più semplici del raytracing. Puoi anche unire le superfici univariate raytrace o raymarch molto più facilmente di altri tipi! blog.demofox.org/2015/07/28/rectang-bezier-patches
Alan Wolfe

Risposte:


14

Prima di tutto, ecco il metodo Kajiya che penso tu stia pensando: Kajiya, Ray Tracing Parametric Patches , SIGGRAPH 82. La versione del rapporto tecnico potrebbe essere più istruttiva.

Ciò che spero che tu ottenga è che non è impossibile e non è concettualmente difficile se non ti dispiace sporcarti le mani con una geometria algebrica e numeri complessi. Tuttavia, farlo direttamente è assurdamente costoso.

I ray tracer "reali" tendono a fare una combinazione di due cose:

  • Posizionare una gerarchia di delimitazione (ad es. AABB) sulla patch per ottenere un buon "valore iniziale" per un cercatore di radici numerico. Se lo fai bene, puoi evitare il problema "rughe".
  • Tesselando la patch in gusci DDG e ray tracciandoli come mesh poligonali.

L'ultimo punto sembra uccidere il requisito della "super scorrevolezza", ma non è così grave se si utilizzano i differenziali di raggio . La corrispondenza del livello di tassellatura con la "dimensione" del raggio limita bene l'errore. Inoltre, probabilmente avrai bisogno di differenziali per le coordinate delle trame, quindi potresti anche usarlo per controllare anche l'accuratezza del test di intersezione.

Sfruttare la coerenza temporale non è una cattiva idea, ma esattamente come lo faresti dipende molto dalla rappresentazione del tuo grafico di scena. Potresti voler guardare la coerenza dei raggi. Chiedi al tuo motore di ricerca preferito informazioni su ray pack tracing e ray reordering .


9

è un sogno irrealizzabile sperare di risolvere algebricamente l'intersezione superficie Ray / Bezier

Sì, è un sogno irrealizzabile. Una patch bicubica di Bezier è una superficie algebrica di grado 18. Per intersecare un raggio con questa superficie, devi trovare le radici di un polinomio di grado 18. Non esiste una formula per queste radici: devi trovarle con metodi numerici . In effetti, ci sono risultati matematici ( il teorema di Abel-Ruffini ) che ci dicono che non possono mai esserci formule per radici di equazioni oltre il grado 4. La matematica non dice semplicemente che le formule non sono state ancora trovate; dice che non saranno mai trovati, perché non possono esistere.

Se vuoi davvero fare un ray tracing analitico (algebrico) di forme curve, potresti provare a usare i cerotti Steiner . Questi hanno un grado 4, quindi l'intersezione ray-patch può essere calcolata trovando le radici di un quartico (cioè un polinomio di grado 4). Esistono formule per trovare le radici dei quartici, ma sono piuttosto brutte, ed è sorprendentemente difficile scrivere codice che implementa le formule in modo affidabile.


5

Un'altra opzione, che ho usato un paio di decenni fa (yikes!), È usare lo schema di Toth del 1985 che impiegava l'aritmetica dell'intervallo per restringere lo spazio di ricerca. IIRC, alla fine farà ricorso a Newton-Rhapson ma, sempre IIRC, penso che raramente siano necessari più di uno o due passaggi per arrivare a una buona soluzione.

Anche se non l'ho visto (beh, a parte una rapida occhiata) Mitchell ha pubblicato alcuni lavori più recenti sul ray tracing con la matematica a intervalli.

(Dovrei aggiungere che, se stai solo facendo superfici di Bezier, allora il metodo dell'intervallo potrebbe essere un po '"eccessivo" poiché puoi usare trucchi come la fioritura per ottenere limiti e derivate. Se, tuttavia, combini le curve di Bezier con altre funzioni, ad es. rotazione attorno ad un asse, quindi la sua generalità è più utile.)


1

https://www.shadertoy.com/results?query=bezier ordina per età, in caso di problemi di compatibilità:

, ... mostra molte soluzioni di molti sottoinsiemi di spline, restituendo la distanza a una spline 2D o tracciando una patch 3d. Spline e patch sono disponibili in molte forme. il cielo è più semplice, il più bezier è semplice, i nurbs sono eccessivamente complessi. Più vincoli aggiungi alla tua spline, più diventa semplice. NURBS è un'estensione eccessiva; - la non uniformità dei pesi (la "NU") diminuisce l'efficienza rispetto alle spline più simmetriche - la sua Ration-al-ness (la R) aggiunge anche una certa complessità, per la segmentazione (razionamento) e la miscelazione con segmenti vicini (risolto ricorsivamente).

bezier-patch-tracing risolve le radici e da ciò deriva la priorità contestuale sulla precisione; in quale ordine risolvere l'equazione quadratica. ciò diventa poco pratico su esponenti più elevati rispetto a quelli cubici, a causa della complessità esponenziale e della perdita di precisione.

ray-marching == il rilevamento delle sfere è l'approccio euristico più semplice alla risoluzione dei root, che sembra essere la soluzione semplice ed efficiente per il rendering della maggior parte delle patch di spline.

La rappresentazione di Lagrange semplifica il tracciamento / la marcia (poiché i punti L si trovano sulla spline mentre i punti ControlVector (della stessa spline esatta) sono raramente sulla spline)

Il caso speciale di una spline temporale, dove i primi derivati ​​di stat e end sono == 0. semplifica la continuità e comporta meno differenziali (meno sottrazione). È possibile tracciare in modo efficiente un cerotto su una sola passata: https://www.shadertoy.com/view/4djfW3, mentre altre spline cubiche (o superiori) rendono più efficiente l'approccio euristico di inseguimento di sfere / marce a raggi (e " abbastanza preciso ") che osare calcolare analiticamente tutte le radici per mantenere la radice positiva più piccola (con errori di precisione che accumulano esponenzialmente per ogni radice).


Nel computer grafica, spline e patch sono state quasi completamente sostituite da z-brushing entro il 2006. z-brushing utilizza mappe di spostamento con coordinate omogenee, o addirittura utilizza un "tipo" che ci unisce un insieme di sfere e segmenti di linea (i segmenti di linea hanno un raggio di 0, le sfere hanno una lunghezza di 0, un'unione è semplice e utile). Per una minore perdita di precisione per un grande guadagno in termini di prestazioni a costi di memoria relativamente bassi per una tabella di ricerca, che può essere facilmente reso dinamico su una GPU.


Non importa. tutte le soluzioni di patch 3d vengono eseguite mediante il rilevamento delle sfere.
ollj,

aumenta in modo significativo le prestazioni e la precisione quando la patch è più semplice. a un punto in cui una patch di Seamess Hensines ti porta molto lontano in alcune iterazioni:
ollj

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.