看了一下Mobius带后,我发现它的方程非常简单,并尝试将其添加到我的Raytracer中。

我通过简单地生成彼此相连的N三角形尝试了一种“幼稚”的方式获得所需的形状。虽然这种方法有效,但结果却不是很漂亮:



(顺便说一下,我的法线可能有问题,但我不知道它的来龙去脉来自。)

我在PovRay上进行了尝试,结果令人惊讶。完全平滑的带钢,在远比我的生产时间短的时间内制成。我很确定Povray的优化效果很好,但我也认为它不会像我那样生成三角形。



如果有帮助,这里是实际的使用的代码(C ++):

float step = .1f;
float halW = 0.5f;

_facets.clear();

auto lambda = [this] (float v, float t) {
  Vec_t p;

  float cdv = Tools::Cos(2 * v);
  float sdv = Tools::Sin(2 * v);
  float ctv = Tools::Cos(v);
  float stv = Tools::Sin(v);

  float c = 2 + t * ctv;

  p.x = c * cdv;
  p.z = c * sdv;
  p.y = t * stv;

  return p;
};

for (float v = 0.f; v < Globals::PI; v += step)
{
  if (v > Globals::PI)
    v = Globals::PI;

  for (float t = -halW; t < halW; t += step)
  {
    if (t > halW)
      t = halW;

    Vec3 p1 = lambda(v, t);
    Vec3 p2 = lambda(v + step, t);
    Vec3 p3 = lambda(v, t + step);
    Vec3 p4 = lambda(v + step, t + step);
    _facets.emplace_back(p1, p2, p3);
    _facets.emplace_back(p3, p2, p4);
  }
}

TL; DR

如何在射线跟踪中处理像这样的参数化曲面?

编辑
让上述算法运行约20小时后,我得到了一种更漂亮的结果(3扭转而不是1扭转)。



>

评论

对于第一个图像中以红色概述的特定问题,看来您可能需要先确定要接近表面的哪一侧,然后再确定法线指向的方向,否则某些区域的阴影将不正确。特别是在莫比乌斯带上,因为必须存在法线由于扭曲而切换方向的点。必须有一些法线方向几乎相反的相邻三角形(例如图像中的明暗相邻三角形)。

是的,我也这么认为,但是我正在三角交叉法中设置isInside标志。如果为真,则取反法线向量。如果使用交集方法,如果det <0,则设置该标志,我暂时不记得该名称了

我正在使用Möller-Trumbore相交算法

#1 楼

许多年前,我在处理参数化曲面的光线跟踪器上工作,所以这不太可能是最新技术,但是IIRC,我将区间算术与(binary?)细分和Newton-Rhapson结合使用。 >
区间算术+细分构造的(保守的)边界框可用于交叉拒绝。我想我可能还对一阶导数使用了区间算术,以帮助确定何时可以安全地发射到牛顿-拉普森。通常,牛顿步骤的收敛速度非常快。

还可以将参数化曲面预先切成小方块,并将其放入加速结构(Voxel grid / BVH)中以加快该过程。

此工作基于/受丹尼尔·托斯(Daniel Toth)于1985年发表的论文“关于光线跟踪参数曲面”的启发

评论


$ \ begingroup $
感谢您的回答,但我必须承认我并不了解所有内容。您能放一些具体的例子或代码,以便我看不清吗?
$ \ endgroup $
–Telokis
17 Mar 14 '17:30



$ \ begingroup $
好的。我今天没有时间,但是会尽快添加更多信息。
$ \ endgroup $
–西蒙F
17年3月15日在12:10

$ \ begingroup $
您的建议是我继续使用构造三角形的方法,但是应该使用空间细分算法来“固定”计算?
$ \ endgroup $
–Telokis
17年3月16日在17:00

$ \ begingroup $
在我看来,您有两个基本选择,尽管从某种意义上说,它们都可以收敛为“等效”结果:(a)区间算术,先除掉区域,然后是Newton-Rhapson来求解射线相交或(b)将您的对象切成小块(即细分)成“足够小的”三角形,您不会看到不连续的假象(如您的第一个图像)。从某种意义上说,它们是“相似的”,因为在(a)中,每个Newton-R迭代都将表面局部近似为平面(如小三角形)。我怀疑b会更容易实现,但难以估计理想的细分水平。
$ \ endgroup $
–西蒙F
17 Mar 17 '17 at 10:19

#2 楼

通常,在光线跟踪器中进行参数化时,需要一个
$ \ begin {cases} P = v * t + C \\
P = f(u,v)
\ end {cases} $

获得最低的$ t $,其中$ f(u,v)$是您的参数函数$ C $是摄影机位置,$ v $是射线方向。

有几种通用方法,例如,如果您可以判断2个点是否在同一侧,则可以在射线的相反侧取2个点并进行二进制搜索,直到找到深度。您可以沿着射线行进来找到第一对。

评论


$ \ begingroup $
“同一边”是什么意思?我知道“怎么做”的一般想法,但我不知道它在实践中是如何发生的。 Povray给出了如此准确和漂亮的结果,我不知道它怎么可能做到。
$ \ endgroup $
–Telokis
17年3月14日在17:36