1

一段时间以来,我一直在编写 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)
4

1 回答 1

1

关于这个主题有很多文献,例如https://www.researchgate.net/publication/232644373_Direct_and_fast_ray_tracing_of_NURBS_surfaces。这适用于一般 NURBS。不确定您是否可以简化二次 NURBS 的事情。

基本思想是将您的光线视为两个平面N的交点。r = a, Mr = b。使用N , M平面的法向量,a, b 常数。如果r = R (u,v) 是你的 NURB 函数。这为您提供了两个变量中的两个方程来求解。

这是我有点不确定的地方。我认为对于二次 NURBS,您可以将函数表示为两个二次多项式R (u,v) = P (u,v) / Q(u,v) 的商,其中P是向量值,Q 只是一维多项式. 如果是这样,您要解决的方程是

ñP (u,v) = 一个Q (u,v) MP (u,v) = b Q (u,v)

这是两个变量中的两个二次方。您可以使用各种数值方法,例如牛顿法或梯度下降法,并且由于方程是二次方程,它应该相对快速地收敛。

您需要分别考虑每个补丁(0 < u < 1/3、0 < v < 1/3 等)以应对函数的分段性质。

于 2017-01-04T17:47:23.203 回答