我正在编程GLSL光线跟踪一段时间后我做了一些改进,但是从观点来看,我认为光线跟踪曲面而不是很多三角形要快得多,所以我遇到了NURBS。如果我写下等式(扩展 - >只有+, - ,*,/,sqrt和square),我看不到任何方法来获得与光线的交点。
你们中是否有人知道如何对2级NURBS进行光线追踪?
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)
答案 0 :(得分:1)
有很多关于这个主题的文献,例如https://www.researchgate.net/publication/232644373_Direct_and_fast_ray_tracing_of_NURBS_surfaces。这是一般的NURBS。不确定你是否可以简化二次NURBS的事情。
基本思想是将您的光线视为两个平面 N 的交点。 r = a, M 。 r = b。对于 N , M 法向量到平面,a,b常数。如果 r = R (u,v),则为NURB函数。这为您提供了两个要求解决的变量的方程式。
这是我有点不确定的地方。我认为对于二次方NURBS,你可以将函数表示为两个二次多项式的商 R (u,v)= P (u,v)/ Q(u,v ),其中 P 是矢量值,Q只是1D多项式。如果是这样,你要解决的等式是
N 。 P (u,v)= a Q (u,v) M 。 P (u,v)= b Q (u,v)
这是两个变量中的两个样方。您可以使用各种数值方法,如牛顿方法或梯度下降,因为方程是二次方的,它应该相对快速地收敛。
您需要分别考虑每个补丁(0