【问题标题】:finding the intersection of a line with an arbitrary surface?找到一条线与任意曲面的交点?
【发布时间】:2013-09-10 09:55:37
【问题描述】:

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

Ax + BY + CZ +d = 0 

而 A,B 和 C 是 Plane Normal = [A B C] 的法线向量的分量 并使用 Ray 方程:Ray = Source + t*Direction 然后对t求解,就可以找到交点了。

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

如果您可以编辑标签以获得正确的标签,请这样做。

【问题讨论】:

  • 你试过sym吗?
  • 不,我没有,但我认为我不需要它
  • 我会将问题的标题更改为“如何找到一条线与任意曲面的交点?”

标签: matlab graphics computer-vision raytracing


【解决方案1】:

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

【讨论】:

  • 我什至有一个函数可以给我每个点的法线向量,但我不知道如何计算交点你能帮我解释一下怎么做吗?
  • 偏导数在平面上总是正交的。
【解决方案2】:

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

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

如果不是这样,您应该尝试定义自己的函数,该函数可以根据xy 计算z

对于这条线,我们有

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);

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

【讨论】:

    【解决方案3】:

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

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

    我觉得你一点问题都没有

    【讨论】:

    • 如果点在多个平面的交点处,一阶导数不连续怎么办?然后呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多