问题标签 [raytracing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
941 浏览

objective-c - 为什么我的光线追踪球体在使用多个光源时会出现暗线?

我有一个简单的光线追踪器,它只能返回到第一个交叉点。使用两个不同的光源时,场景看起来不错,但是当两个灯都在场景中时,即使在来自另一个光源的照明区域的中间,也会在一个照明区域的末端出现暗阴影(尤其是在绿球)。从“两种光源照明的区域”到“仅一种光源照明的区域”的过渡似乎比“仅一种光源照明的区域”稍暗。

由 imgur.com 主办

我添加灯光效果的代码是:

我怎样才能使它看起来正确?

0 投票
2 回答
1123 浏览

algorithm - 3D hex-like tile maps 上的光线追踪 (LoS)

问候,

我正在开发一个使用 3D 六边形瓷砖地图变体的游戏项目。瓷砖实际上是立方体,而不是六边形,但布局就像六边形一样(因为可以将正方形变成立方体以从 2D 外推到 3D,但没有 3D 版本的十六进制)。这里没有详细的描述,而是一个 4x4x4 地图的示例:

(我已经突出显示了一个任意图块(绿色)及其相邻的图块(黄色),以帮助描述整个事情应该如何工作;但邻接函数不是问题,这已经解决了。)

我有一个结构类型来表示瓦片,地图表示为瓦片的 3D 数组(包装在一个Map类中以添加一些实用方法,但这不是很相关)。每个图块都应该代表一个完美的立方空间,并且它们的大小完全相同。此外,相邻“行”之间的偏移量正好是图块大小的一半。

这已经足够了。我的问题是:
给定两个点的坐标A和,我如何生成一个瓷砖列表(或者,更确切地说,它们的坐标),它们之间的B直线会交叉?AB

这稍后将用于各种目的,例如确定视线、充电路径合法性等。

顺便说一句,这可能很有用:我的地图使用 (0,0,0) 作为参考位置。地图的“锯齿状”可以定义为将每个图块((y+z) mod 2) * tileSize/2.0从其在“正常”笛卡尔系统上的位置向右偏移。对于非锯齿行,产生 0;对于(y+z) mod 2为 1 的行,它会产生 0.5 个图块。

我正在开发针对 .Net Framework 4.0 的 C#4;但我真的不需要特定的代码,只需要解决奇怪的几何/数学问题的算法。我已经尝试了几天来解决这个问题,但无济于事;并试图在纸上画出整个东西以“可视化”它也无济于事:(。

提前感谢您的任何回答

0 投票
2 回答
1802 浏览

matlab - Matlab - 将点正交传播到形状边界的边缘

我有一组点,我想将它们传播到由二进制图像定义的形状边界的边缘。形状边界由 1px 宽的白色边缘定义。

我将这些点的坐标存储在 2 行乘 n 列的矩阵中。该形状形成一个凹形边界,其内部没有孔,由大约 2500 个点组成。我希望在形状边界上传播大约 80 到 150 个点。

我想从一组点中的每个点在正交方向上投射一条射线,并检测它在哪个点与形状边界相交。正交方向已经确定。出于所需的目的,它是使用为点计算的轮廓的法线计算的,使用点-1 和点+1。

最好的方法是什么?是否有某种可以使用的光线追踪算法?

非常感谢您的帮助!

编辑:我试图让问题更清楚,并添加了描述问题的图像。在图像中,灰线代表形状轮廓,红点代表我想要传播的点,绿线代表假想的正交投射光线。

替代文字 http://img504.imageshack.us/img504/3107/orth.png

另一个编辑:为澄清起见,我发布了用于计算每个点的法线的代码。其中 xt 和 yt 是存储每个点的坐标的向量。在计算出正常值后,它可以通过使用 linspace 函数和正交线的请求长度来传播。

0 投票
1 回答
2699 浏览

c++ - 指向丢失 vfptr 的派生类对象的指针

首先,我正在尝试编写一个普通的、简单的 Ray Tracer。在我的 Ray Tracer 中,我在世界上有多种类型的几何图形,它们都派生自一个名为“SceneObject”的基类。我在这里包含了它的标题。

如您所见,我已经包含了几个要在其他地方实现的虚函数。在这种情况下,我只有两个派生类——Sphere 和 Triangle,它们都实现了缺少的成员函数。最后,我有一个 Parser 类,其中充满了执行实际“光线追踪”部分的静态方法。这是相关部分的几个片段

现在,我放弃了真正的光线追踪部分,而是简单地返回第一个命中对象的颜色,如果有的话。毫无疑问,您已经注意到,计算机知道射线与对象相交的唯一方法是通过我也包括在内的 Scene.intersect()。使用的成员变量是“向量对象”见结尾

好的,现在解决问题。我首先创建一个场景并用 Parser::trace() 方法之外的对象填充它。现在由于一些奇怪的原因,我为 i=j=0 投射了 Ray,一切都运行得很好。但是,当第二条射线被投射时,存储在我的场景中的所有对象都不再识别它们的 vfptr(也就是说,我仍然可以访问所有的 SceneObject 方法,除了那些虚拟的方法)!我使用调试器单步执行代码,发现所有 vfptr 的信息在 getColor() 结束和循环继续之间的某处丢失。但是,如果我将 getColor() 的参数更改为使用 Scene& 而不是 Scene,则不会发生任何损失。这是什么疯狂的巫术?

场景代码,根据要求:

0 投票
2 回答
1054 浏览

open-source - 有哪些更好的开源光线追踪器?

我只是想知道开源光线追踪软件有哪些选择。例如。Yafaray,POV-Ray,还有什么?任何关于其相对优点的意见也将不胜感激。

0 投票
1 回答
2163 浏览

raytracing - 没有 Raymarching 的光线追踪元球

在我看到的所有在线示例中,在渲染元球(势函数的水平集)时,总是通过 raymarching 找到射线-元-球的交点。是否有任何替代方法可以明确确定这一点?

0 投票
2 回答
835 浏览

c++ - 多线程光线追踪器的噪声

这是我的第一个多线程实现,所以可能是初学者的错误。线程处理每第二行像素的渲染(因此所有渲染都在每个线程内处理)。如果线程分别渲染屏幕的上部和下部,问题仍然存在。

两个线程都从相同的变量中读取,这会导致任何问题吗?据我了解,只有写作会导致并发问题......

调用相同的函数会导致任何并发问题吗?再说一次,据我所知,这应该不是问题......

两个线程唯一一次写入同一个变量是在保存计算的像素颜色时。这存储在一个数组中,但它们从不写入该数组中的相同索引。这会导致问题吗?

多线程渲染图像 (防止垃圾邮件阻止我直接发布图像..)

附言。我在这两种情况下都使用完全相同的实现,唯一的区别是为渲染创建了一个线程和两个线程。

0 投票
5 回答
235 浏览

math - 确定光子是否以及在何处与 3D 空间中的多边形碰撞

问题很简单:

1) 我们有一个光子从点 1 (x,y,z) 到点 2 (x,y,z),这两个点都可以位于 3D 空间中的任何位置。

2)我们有一个多边形,它既可以在 x 轴和/或 y 轴上随机旋转,也可以位于 3D 空间中的任何位置。

3)我们想要找到:a)光子是否会与多边形碰撞,b)如果它确实会在哪里(x,y,z)?

问题的图像:http: //dl.dropbox.com/u/3150177/Programming/3D/Math/Photon%20Path/Photon%20Path.png

这样做的目的是计算光子的路径应该如何从与多边形的相互作用中改变。

我现在正在阅读这个主题,但我想知道是否有人可以给我一个先机。提前致谢。

0 投票
2 回答
3218 浏览

geometry - 用于三角形交叉加速结构的简单 C/C++ 库

我正在进行光线追踪,并希望通过一些加速结构(kd-tree、BVH 等)来加速它。我不想自己编码。到目前为止我已经尝试过:

  • 将 kd-tree 从 pbrt 中拉出。有太多的内部依赖关系,如果不将所有 pbrt 都拉到我的代码中,我就无法成功。

  • CGAL 的 AABB 树。令人沮丧的是,这似乎只返回了交点。在不知道该点来自哪个三角形的情况下,我无法在三角形上有效地插入颜色。我很想用颜色来扩展“点”的概念,但是如果不从头开始编写大量模板代码,这似乎是不可能的。

  • 自己写。好的,所以我编写了自己的网格加速类,它可以工作,但它很讨厌而且效率低下。

因此,如果有人可以建议一个我可以用于此目的的简单库,我将不胜感激!我只需要一个三角形汤和射线,找到最近的交点并返回该三角形的索引。

0 投票
4 回答
2362 浏览

c++ - 如何保留一个类的实例列表?

我正在用 C++ 编写光线追踪器,并且需要能够检查与场景中每个对象的交集(稍后会进行优化),为此,我需要保留类实例的运行列表。创建新实例时更新的指针列表将不起作用,因为据我所知,在初始化后无法增加数组的大小。如果有一个内置(C++)解决方案,我真的很想要。