找到一条线与任意曲面的交点?

时间:2013-09-10 09:55:37

标签: matlab graphics computer-vision raytracing

我正在使用光线追踪,并且在开始时我假设了一个平面,所以我使用了平面的方程式:

Ax + BY + CZ +d = 0 

而A,B和C是平面法线的法线向量的分量= [A B C] 并使用Ray方程:Ray = Source + t * Direction 然后解决它,我可以找到交叉点。

我现在的问题是我在matlab中有函数来读取对象的表面,但是对象可能不是平面,我得到表面的表面[XYZ]的数据,但我不知道哪个方程我应该用来找到t然后是交点。而且我甚至有一个函数可以在每个点给我正常的向量

如果您可以编辑标签,请选择正确的标签。

3 个答案:

答案 0 :(得分:0)

它可能不是平面,但您始终可以在每个点计算法向量。你只需要更加努力地去做。在平面坐标中取两个偏导数,与这些矢量交叉,这就是该点的正常值。

答案 1 :(得分:0)

如果表面在某个X-Y网格上定义为高度Z,则可以使用fzero轻松解决。这将排除一些复杂的形状,但可能适用于标准光学问题,如光线撞击镜头。假设XYZ是具有相同形状的二维矩阵。然后你可以进行像

这样的二维插值
z_interp = interp2(X,Y,Z,x_interp,y_interp)

如果不是这种情况,您应该尝试定义自己的函数,该函数可以根据zx来计算y

对于该行,我们有

x_ray = x_source + t * x_dir
y_ray = y_source + t * y_dir
z_ray = z_source + t * z_dir

因此,您现在可以定义一个函数来计算表面上方的高度,作为t的函数

height_above_plane = @(t) z_source + t * z_dir - interp2(X, Y, Z, ...
    x_source + t*x_dir, y_source + t*y_dir)

请注意,这可能不是从点到平面的最短距离,它只是沿z方向测量的高度。现在可以通过搜索高度为零的t找到光线撞击表面的时间。可以使用fzero

对任意函数执行此操作
t_intercept = fzero(height_above_plane, 0);

这适用于定义曲面的函数相对平滑且光线仅穿过曲面一次的简单情况。有可能将具有更复杂几何形状的情况转换为如此简单的情况。

答案 2 :(得分:-1)

如果你能得到表面的X Y Z,你说你可以得到每个点的法向量,那你现在的问题是什么?

曲面的X Y Z是交点,如果每个点都有法向量,那么你可以计算你想要的任何东西(反射光线或折射光线)。

我认为你没有任何麻烦