有谁知道如何对 2 阶 NURBS 进行光线追踪?
Do anyone know how to raytrace NURBS of degree 2?
我编写 GLSL 光线追踪已有一段时间了,我做了一些改进,但自从查看日以来,我认为光线追踪曲面而不是许多三角形会快得多,所以我遇到了 NURBS。如果我写下方程式(扩展 --> 仅 +、-、*、/、sqrt 和平方),我看不到任何方法来获得与射线的交点。
你们中有人知道如何对 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)
有很多关于这个主题的文献,例如 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 只是一维多项式。如果是这样,您要求解的方程式是
N。 P(u,v) = a Q(u,v)
M。 P(u,v) = b Q(u,v)
这是两个变量的两个二次方程。您可以使用各种数值方法,例如牛顿法或梯度下降法,并且由于方程是二次方程,因此收敛速度应该相对较快。
您需要分别考虑每个补丁(0 < u < 1/3、0 < v < 1/3 等)以应对函数的分段性质。
我编写 GLSL 光线追踪已有一段时间了,我做了一些改进,但自从查看日以来,我认为光线追踪曲面而不是许多三角形会快得多,所以我遇到了 NURBS。如果我写下方程式(扩展 --> 仅 +、-、*、/、sqrt 和平方),我看不到任何方法来获得与射线的交点。
你们中有人知道如何对 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)
有很多关于这个主题的文献,例如 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 只是一维多项式。如果是这样,您要求解的方程式是
N。 P(u,v) = a Q(u,v) M。 P(u,v) = b Q(u,v)
这是两个变量的两个二次方程。您可以使用各种数值方法,例如牛顿法或梯度下降法,并且由于方程是二次方程,因此收敛速度应该相对较快。
您需要分别考虑每个补丁(0 < u < 1/3、0 < v < 1/3 等)以应对函数的分段性质。