2

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

Ax + BY + CZ +d = 0 

而 A、B 和 C 是平面法线 = [ABC] 的法线向量的分量,并使用射线方程:射线 = 源 + t*方向然后求解 t,我可以找到交点。

我现在的问题是我在 matlab 中具有读取物体表面的功能,但物体可能不是平面表面,我正在获取表面的表面 [XYZ] 的数据,但我不知道应该使用哪个方程找到 t 然后找到交点。我什至有一个函数可以给我每个点的法线向量

如果您可以编辑标签以获得正确的标签,请执行此操作。

4

3 回答 3

0

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

于 2013-09-10T09:58:18.790 回答
0

如果您的表面被定义为某个 XY 网格上的高度 Z,您可以使用fzero. 这将排除一些复杂的形状,但可能适用于标准光学问题,例如光线撞击镜头。假设X和是具有相同形状YZ二维矩阵。然后你可以做一个二维插值

z_interp = interp2(X,Y,Z,x_interp,y_interp)

如果不是这种情况,您应该尝试定义自己的函数,该函数可以z基于x和进行计算y

对于这条线,我们有

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

因此,您现在可以定义一个函数,计算表面上方的高度作为 as 的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);

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

于 2013-09-10T10:32:02.867 回答
-1

如果你能得到表面的 XYZ 并且你说你可以得到每个点的法线向量那么你现在的问题是什么?

表面的 XYZ 是交点,如果每个点都有法线向量,那么您可以计算任何您想要的(反射或折射光线)。

我觉得你一点问题都没有

于 2013-09-10T10:06:47.080 回答