问题标签 [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 投票
2 回答
949 浏览

c - 球面与线相交的参数方程和代数方程的区别

我正在用 C 语言编写光线跟踪器,并使用笛卡尔方程绘制球体:

我有我的眼睛位置 (x_eye, y_eye, z_eye) 和我的眼睛矢量 (Vx, Vy, Vz)。我的线的参数方程是:

我把我的线的参数方程放在球体的笛卡尔方程中以解决它

我现在得到了一个像 ax^2 + bx + c = 0 这样的方程,并定义 a, b, c :

然后如果存在交叉点(b^2 - 4.ac >= 0),我可以为每个像素找到 k。

但是有没有其他方法可以使用这些线和球
线的参数方程来找到 k:

对于球体:

我怎么能用这两个参数方程找到k?
我应该怎么做

0 投票
1 回答
3284 浏览

python - Python 光线追踪

我正在用纯 Python 构建一个简单的 Python 光线追踪器(只是为了它),但我遇到了障碍。

我的场景的设置目前是这样的:

  1. 相机位于0, -10, 0沿y轴的方向。
  2. 半径1位于 的球体0, 0, 0
  3. 成像平面物体1与相机的距离为 ,宽度和高度为0.5

我正在通过成像平面以均匀随机分布的方式拍摄光子,如果光子恰好与物体相交,我会在图像画布上绘制一个红点,对应于图像平面上光线通过的点。

我的交集代码(我只有球体):

还有我的渲染代码(它渲染一定数量的光子,而不是逐像素):

它应该可以正常工作,但是当我渲染测试图像时,我没有得到任何看起来像球体轮廓的东西:

在此处输入图像描述

我期待这样的事情:

在此处输入图像描述

有人知道为什么我的代码不能正常运行吗?我一直在调整和重写这一部分太久了......

0 投票
1 回答
484 浏览

python - 为什么我的路径跟踪代码不起作用?

我一直在用纯 Python 编写一个路径跟踪器,只是为了好玩,而且由于我之前的阴影不太漂亮(兰伯特余弦定律),我正在尝试实现递归路径跟踪。

我的引擎给出了一个失败的输出:

在此处输入图像描述

我的路径跟踪函数是递归定义的,如下所示:

我的场景(我制作了自定义 XML 描述格式)是这样的:

我很确定我的引擎存在一些根本缺陷,但我就是找不到它......


这是我的新跟踪功能:


我很确定路径跟踪代码有效,因为我手动投射了一些光线并得到了相当合理的结果。我(现在)遇到的问题是相机不会通过图像平面中的所有像素拍摄光线。我编写了这段代码来查找与像素相交的射线,但它无法正常工作:

0 投票
3 回答
2085 浏览

opengl - 从 2D 投影映射回 3D 点云

我有一个由点顶点 (XYZ) 和最终三角形面组成的 3D 模型。使用 OpenGL 或 camera-view-matrix-projection 我可以将 3D 模型投影到 2D 平面,即视图窗口或具有 m*n 分辨率的图像。

问题是如何确定 2D 投影计划中的像素与其原始 3D 模型中相应的顶点(或面)之间的对应关系。

即,
对于 2D 投影中的给定像素,3D 模型中最接近的顶点是什么?
这听起来像是选择 openGL 或光线追踪问题。但是有没有简单的解决方案?

使用光线追踪的想法,它实际上是关于从一个视点找到与光线相交的第一个顶点/面。有人可以给我看一些教程或例子吗?我想找到一种独立于使用 OpenGL 的算法。

0 投票
1 回答
689 浏览

opengl - 3D 多边形模型上的光束追踪(光束交叉点)库

我想模拟一个激光扫描仪,它将激光束发射到 3D 模型上以测量距离或模型的其他特征。3D模型由xyz坐标中的顶点和面组成;每个顶点也有一些用户定义的特征。

方法应该很简单。我定义了一个视点和视矢量(即激光束);我需要做的是检查与视图向量相交的第一个顶点或第一个面,然后我可以测量距离并评估最近顶点的特征。

有没有可用的库或工具来做到这一点?

0 投票
2 回答
1883 浏览

graphics - 用我的光线追踪器帮我解决这个错误

我不会为这个问题发布任何代码,因为它需要太多的上下文,但我会从概念上解释我在做什么。

我正在构建一个使用仿射变换的简单光线追踪器。我的意思是我将相机坐标中的所有光线与通用形状相交。这些形状都具有相关的仿射变换,光线首先乘以这些变换的倒数,然后再与场景对象相交。

例如,假设我想要一个位于 (10,10,10) 的半径为 3 的球体。我创建了球体并给它一个表示这个变换的变换矩阵。

我在相机坐标中创建了一条射线。我将射线乘以球体变换矩阵的逆矩阵,并将其与通用球体相交(r=1 在 (0,0,0) 处)。我在交叉点处沿这条通用射线的距离,并使用它找到通用法线和沿原始射线的点,并将它们保存到一个变换对象中(连同距离(t)和实际变换)。

当需要计算这个交点的颜色时,我采用变换的逆转置并将其乘以通用法线以找到法线。如果我使用来自逆变换射线的交点的t值,则交点就是沿原始未变换射线的点。

问题是,当我以这种方式做事时,转换会产生奇怪的效果。主要效果是变换似乎将灯光从场景中拖出。如果我构建一堆图像并在每一帧中对球体应用稍大的旋转,它似乎会拖动场景中的灯光。这是一个例子

老实说,我无法弄清楚我在这里做错了什么,但我正在扯掉我的头发。我想不出任何好的理由来发生这种情况。任何帮助将不胜感激。

0 投票
2 回答
2135 浏览

math - 光线追踪中的 3D 仿射变换问题

全部,

我正在编写一个相当非传统的光线追踪器来计算场景中各种物体的传热特性。在这个光线追踪器中,随机光线从我的原始对象的表面射入场景以检查交叉点。

这种特定的算法要求每条射线在原始空间中进行开发,然后由源对象仿射变换到世界空间,然后仿射变换回场景中其他对象的原始空间以检查相交。

一切都很好,直到我做了一个各向异性比例,例如按 [2 2 1] 缩放一个对象(各向同性比例很好)。这让我相信我没有正确地转换光线的方向分量。目前,我通过将方向分量乘以源对象逆变换矩阵的转置将光线方向从原始空间转换到世界空间,然后通过乘以目标对象变换的转置,将光线从世界空间转换到每个原始空间矩阵。

我还尝试乘以源图元的变换矩阵以从原始空间到世界空间,并乘以目标逆变换以从世界空间到原始空间,但这不成功。

我相信从原始物体表面(在随机点和随机方向)发射的光线应该以与“常规”光线追踪中的表面法线相同的方式进行转换,但我不确定。

那里的任何专家都知道我的方法中的缺陷是什么?随时询问是否需要更多信息。


该光线追踪器的基本算法如下:

希望能澄清这个问题,让我们看一个例子。假设我有一个沿 z 轴(单位半径和高度)延伸的圆柱体和一个位于 xy 平面内的环形空间,内径为 7,外径为 8。我希望在 x 和 y 中将圆柱体缩放 6 倍方向(但不是z方向)所以我的仿射变换矩阵如下:

现在假设我有一条射线,它在圆柱体 s 的表面上具有一个随机起点,并且在远离圆柱体 c 表面的一个随机方向上给出射线 r(os) = s + ct。

我想将此射线从原始(对象)空间转换为世界空间,然后测试与场景中的其他对象(环)的相交。

第一个问题是使用 M(圆柱体)或 M^-1(圆柱体)将射线 r(os) 转换到世界空间 r(ws) 的正确方法是什么。

第二个问题是使用 M(annulus) 和 M^-1(annulus) 将光线 r(ws) 从世界空间转换到对象空间以检查与其他对象相交的正确方法是什么。


一些额外的背景信息:

此应用程序用于计算 N 个对象之间的辐射传热。射线从物体上的随机点发射,其方向被随机选择以位于以随机点处的表面法线定向的半球形分布内。


这是我的问题的一些可视化。首次生成时的光线方向分布: 初始光线方向分布

如果我使用变换矩阵 M 将变换应用于世界坐标: M变换的方向

如果我使用逆变换矩阵 M^-1 将变换应用于世界坐标 由 M^-1 变换的方向

0 投票
1 回答
590 浏览

opengl - 用 fwidth 确定 miplevel

GLSL 函数 fwidth(p) 究竟做了什么?

我知道它被实现为:

但我不确定我是否得到它。

我在这里做一些基本的光线投射并尝试计算所需的 miplevel。要找到 miplevel,请在光线撞击体积的坐标上调用 fwidth(在纹理空间中)。

据我了解,GLSL 将同步所有线程并计算与顶部和右侧相邻线程的导数。

在遍历期间,我对范围进行线性插值:

如果这是正确的级别,则应该是对当前位置进行采样所需的 mip 级别。但是目前体积采样步长太大了……尽管如果与相机的距离减小,它会减小。

0 投票
1 回答
5018 浏览

3d - Raytracer - 计算眼睛光线

我正在写一个光线追踪器(主要是为了好玩),虽然我过去写过一个,并且花了相当多的时间搜索,但似乎没有教程能阐明在透视投影中计算眼睛光线的方法,不使用矩阵。

我相信我最后一次这样做是(可能)x/y使用Quaternion类从相机方向向量中低效地旋转眼睛向量度数。这是用 C++ 编写的,我正在用 C# 做这个,尽管这并不重要。

伪代码(假设 V * Q = 变换操作)

我认为实际问题在于它模拟的是球形屏幕表面,而不是平面屏幕表面。

请注意,虽然我知道如何以及为什么要使用叉积、点积、矩阵等,但我实际的 3D 数学问题解决能力并不出色。

所以给出:

  • 相机位置、方向和上矢量
  • 视野
  • 屏幕像素和/或子采样分区

为光线追踪器的 x/y 像素坐标生成眼睛光线的实际方法是什么?

澄清一下:我正是我想要计算的,我只是不擅长提出 3D 数学来计算它,而且我发现没有光线追踪器代码似乎有我需要计算眼睛光线的代码单个像素。

在此处输入图像描述

0 投票
2 回答
2773 浏览

c# - 光线投射/光线追踪:从相机拍摄光线

我正在用 c# 编写一个简单的光线追踪器/光线投射器。我过去使用过 Vectors,所以我编写了一个名为 Vector3D 的类,如下面的代码所示。我还写了一个类来处理光线。现在,我关心的是确保光线来自相机,并投射到屏幕上的所有像素,然后投射到场景中相机前面的对象。我已经过期将文本写入输出(Debug.WriteLine),但很难看出它是否真的有效。以下代码是否合适,或者您会推荐其他方法或网站来参考/指导我吗?