【问题标题】:Analytic method for calculate a mirror angle计算反射镜角度的解析方法
【发布时间】:2015-09-28 18:45:21
【问题描述】:

我在 3D 空间中有一个固定的光线Lr 和一个可以围绕固定点Mrot 旋转的镜子M,这个点不在镜子的同一平面上,换句话说就是镜子平面与以Mrot 为中心、半径固定为d 的球体相切。使用这种配置,我想找到一个方程,它接收点 P 作为参数,并在 3D 空间中旋转镜子。

我们可以认为镜像平面没有边界(无限平面)并且它的旋转没有限制。此外,镜子只在其旋转点的另一侧反射。

图中是两个输入点P1P2不同的情况,它们各自的解角alpha1alpha2。图片为 2D 以简化图纸,真实案例为 3D。

目前我正在计算与镜面随机旋转的交点,然后计算光线反射,看看离我想要到达的点 (P) 有多远。最后用一些改变旋转的条件进行迭代,直到匹配为止。

显然这是一种矫枉过正,但我​​无法弄清楚如何以分析方式对其进行编码。

有什么想法吗?

注意:我注意到,如果镜子围绕其平面中的一个点(Mrot)旋转并且光线到达该点(Mrot),我可以轻松计算出镜子角度,但不幸的是不是我的情况。

【问题讨论】:

  • 您能否详细说明镜子可以移动的方式?它就像在球体表面上假设的 Spektre 一样吗?你认为只有飞机的一侧反射吗?
  • @SebastianCabot 镜子相对于点 Mrot 旋转,并且所有可能的旋转都派生到从镜子表面到点 Mrot 的恒定距离。就像@Spektre 假设的那样。而反射面是镜子的反面,像@Spektre 提议的那样面向Mrot

标签: c++ opencv graphics computer-vision raytracing


【解决方案1】:

首先注意这里只有一个参数,即t沿光线射到镜子的距离。

对于t的任意测试值,依次计算

  1. 反射发生的点。
  2. 入射光线和反射光线的矢量。
  3. 镜子的法线向量,通过取归一化入射向量和反射向量的平均值得到。与 1 一起,您现在知道了镜子的平面。
  4. 镜子到旋转点的距离d

现在的问题是选择t 使d 取所需的值。这归结为t 中的八项多项式,因此没有解析公式[1] 并且唯一的解决方案是迭代[2]

这是一个代码示例:

vec3 r;   // Ray start position
vec3 v;   // Ray direction
vec3 p;   // Target point
vec3 m;   // Mirror rotation point

double calc_d_from_t(double t)
{
    vec3 reflection_point = r + t * v;
    vec3 incident         = normalize(-v);
    vec3 reflected        = normalize(p - reflection_point);
    vec3 mirror_normal    = normalize(incident + reflected);
    return dot(reflection_point - m, mirror_normal);
}

现在将calc_d_from_t(t) = d 传递给您最喜欢的根查找器,确保使用t > 0 找到根。任何半体面的根查找器(例如 Newton-Raphson)都应该比您当前的方法快得多。


[1] 即一个涉及算术运算、第 n 个根和系数的公式。
[2] 除非 occtic 因式分解相同,否则可能会将问题简化为四次。

【讨论】:

  • 到旋转点的距离有何不同。他真的只需要找到交点和法线。你能否进一步解释一下。这很有趣
  • @SebastianCabot:据我了解这个问题,M 被限制在与 Mrot 一定距离内。如果没有这个约束,您可以安排镜子在任何点将 Lr 反射到 P,所以问题是找到反射点以遵守到旋转点的距离约束。
  • 是的,这是真的。但是约束是否足以让您找到解决方案?我仍在试图弄清楚,我想更好地理解你的推理。不管我们需要解决什么约束:Rvec = 2*dot(Nvec,IVec)*NVec - Ivec。由于 Psource 和 Pdest 是已知的,我们可以进一步将其简化为 -Pdest = 2*(dot(NVec,IVec))*NVec -PSrc。如果我们使用归一化向量,我想我们可以写成: norm(PSrc) - norm(Pdst) = 2*cos(ang(Nvec,IVec))*norm(n) - 所以我们仍然需要根据你指定的约束我不明白你打算怎么做?
  • 我们不需要知道 cos(ang(Nvec, Ivec)) 因为它只是 n 的归一化常数。我现在已经编辑了答案的那部分。
  • 怎么可能只是t?你不知道要跟随哪条射线。这就是重点。但我可能遗漏了一些对你来说很明显的东西。
【解决方案2】:

我会将其作为 2 个独立的平面问题(一个在 xy 平面,第二个在 xz 或 yz 平面)。我首先想到的是这个迭代过程:

  1. 开始

    • 镜子以恒定距离围绕 Mrot 旋转,创建圆圈(3D 球体)
    • 所以计算 Lr 和球体的第一个交集
    • 如果没有找到交点,则在球体上找到离 Lr 最近的点
    • n0 正常计算为Lr 和从交点到P 的红线之间的半角
    • 这是镜像起始位置
  2. 将镜子(水色)放置到n0 角度

    • 计算Lr的反射
    • 并计算半角da0这是新迭代的步骤
  3. da0 添加到n0 角度并将镜子放置到这个新的角度位置

    • 计算Lr的反射
    • 并计算半角da1这是新迭代的步骤
  4. 循环子弹 3 直到

    • da(i) 够小了
    • 达到最大迭代次数

[备注]

  • 这应该比随机/线性探测更快地收敛到解决方案中
  • P 离镜子越远(或旋转半径越小),收敛越快
  • 不确定这个问题的解析解是否存在,看起来它会导致超越系统......

【讨论】:

  • 是一个快速迭代过程,我更愿意使用它而不是我的实际方法,但我认为不需要迭代的算法会更快。
  • @zaccaro 正如我在笔记中所写的,我不确定是否存在您应该添加更多信息和解决方案的约束,例如旋转半径是否固定? ray 相对于 Mrot 的位置是什么?镜子有多大?什么是旋转角度限制和轴,......等等......草图将是一个好主意,所以绝对清楚什么是什么(请记住,这里的许多人不是以英语为母语的我包括在内,术语s各国之间并不总是相同的)
  • @zaccaro 顺便说一句,如果光线不在一个轴上,那么这不能作为单独的问题来完成,您需要一起迭代展位平面(首先是 xy,然后是 xz,然后是 xy , 然后 xz, ...) 因为在一个轴上倾斜会移动另一个平面反射
猜你喜欢
  • 2015-06-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多