2017-01-04 2 views
1

Ich programmiere ein GLSL Raytracing seit einer Weile und ich eine gewisse Verbesserung, aber seit einem Blick Tagen getan, was ich denke, dass es viel schneller sein würde, gekrümmte Oberflächen statt viele Dreiecken Raytracing ich auf NURBS so kam. Wenn ich die Gleichung (erweitert -> nur +, -, *, /, sqrt und square) schreibe, kann ich keinen Weg finden, einen Schnittpunkt mit einem Strahl zu erhalten.Kann jemand NURBS von Grad 2 raytrace?

Hat einer von euch wissen, wie eine NURBS von Grad 2 bis Raytracing?

This is my equation (no real NURBS equation): 

given : 
(A to I are 3d vectors) 
A 
B 
C 
D 
E 
F 
G 
H 
I 

a = 2(B-A) 
b = 2B-A-C 
c = 2(E-D) 
d = 2E-D-F 
e = 2(H-G) 
f = 2H-G-I 

(a to f are defined to have the equation a bit shorter later) 

o 
r 
(o and r are 3d vectors again) 

searched : 
u, v (, t) 

to solve : 

(A+au-bu²) + ((D+cu-du²)-(A+au+bu²))2v - (2(D+cu-bu²)-(A+au-bu²)-(G+eu-fu²))v² = o+rt 
(NURB) = (LINE) 

Antwort

1

Es gibt ziemlich viel Literatur zu diesem Thema zum Beispiel https://www.researchgate.net/publication/232644373_Direct_and_fast_ray_tracing_of_NURBS_surfaces. Dies ist für allgemeine NURBS. Nicht sicher, ob Sie Dinge für quadratische NURBS vereinfachen können.

Die Grundidee ist, Ihren Strahl als Schnittpunkt zweier Ebenen N zu denken. r = a, M. r = b. Mit N, M Normalen Vektoren zu den Ebenen, a, b Konstanten. Wenn r = R (u, v) ist Sie NURB-Funktion. Dies gibt Ihnen zwei Gleichungen in zwei Variablen zu lösen.

Hier ist ich ein wenig unsicher. Ich denke, für Quadrate NURBS können Sie die Funktion als ein Quotient von zwei quadratischen Polynomen darstellen R (u, v) = P (u, v)/Q (u, v), wobei P ist Vektor bewertet und Q ist nur ein 1D-Polynom. Wenn ja, die Gleichung, die Sie lösen möchten, sind

N. P (u, v) = ein Q (u, v) M. P (u, v) = b Q (u, v)

, die zwei quadratics in zwei Variablen ist. Sie können eine Vielzahl numerischer Methoden wie die Newton-Methode oder Gradientenabstieg verwenden, und da die Gleichungen quadratisch sind, sollte sie relativ schnell konvergieren.

Sie müssen jedes Patch separat betrachten (0 < u < 1/3, 0 < v < 1/3 etc.) mit der stückweise Art der Funktionen zu bewältigen.

+0

danke für die Antwort – noName