标签: raytracing

Python光线跟踪

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

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

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

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

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

def intersection(self, ray):
  cp = self.pos - ray.origin
  v = cp.dot(ray.direction)
  discriminant = self.radius**2  - cp.dot(cp) + v * v

  if discriminant < 0:
    return False
  else:
    return ray.position(v - sqrt(discriminant)) # Position of ray at time t
Run Code Online (Sandbox Code Playgroud)

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

def bake(self, rays):
  self.image = Image.new('RGB', [int(self.camera.focalplane.width * 800), int(self.camera.focalplane.height * 800)])
  canvas = ImageDraw.Draw(self.image)

  for i in …
Run Code Online (Sandbox Code Playgroud)

python raytracing vector

5
推荐指数
1
解决办法
2859
查看次数

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

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

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

也就是说,
2D投影中给定像素的3D模型中最接近的顶点是什么?
这听起来像是在openGL或光线追踪问题中挑选.是否有任何简单的解决方案?

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

opengl 3d raytracing projection hittest

5
推荐指数
1
解决办法
1823
查看次数

计算机图形工业的人们使用什么来进行光线追踪?

我去年参加了计算机图形学课程(研究生水平).我们花了一个学期构建光线跟踪器并为其添加功能.我们在C++中从头开始构建所有内容,大概是为了更好地理解底层数据结构和算法.这是我的问题:如果我想在计算机图形学的工业中找到一份工作,如果我从头开始构建一切像这样的光线跟踪,人们会认为我疯了吗?是否有类似于OpenGL的图形框架支持光线跟踪?OpenGL本身是否支持光线跟踪?

我的课程教授是计算机图形学理论和相关数学基础知识的专家,但对专业人员用于计算机图形学的现代框架和库没有任何理解.她更像是一名科学家而非一名修炼者.

如果我使用库来帮助我进行光线跟踪,那么如果它支持将计算分发到计算机集群可能会很好.我也可以使用图书推荐,如果你知道一个可以帮助我理解这个差距的书.

c++ opengl graphics frameworks raytracing

5
推荐指数
1
解决办法
795
查看次数

在路径追踪中处理点光源和精确反射

试图实现蒙特卡罗路径追踪,我在光采样程序中遇到了麻烦.

通常,程序如下:

  • 跟踪从相机(或从前一点)开始的光线,直到到达表面点.
  • 达到表面点后,在场景中的光源上随机生成一个点.
  • 计算几何项,描述该光是否可以达到曲面上的当前点(该项为0或1).
  • 如果此几何项为1,则通过乘以衰减系数(光的距离)和材料的BRDF来计算该光的贡献.

我遗漏了一些关于如何随机选择事物的细节,但暂时不介意(参见例如"分布光线跟踪中的灯具采样").

我认为问题在于,BRDF和光源中的光分布都不是实际功能,而是测量.
例如,对于每个入射角,完美反射镜的BRDF是反射方向上的dirac delta"函数"(即,在一点上支持的度量,在该点处质量为1).类似地,与密度函数相反,点光(与区域光相对)由狄拉克三角洲建模.

直接区分似乎很重要,因为它允许适当的重要性抽样.例如,在对BRDF进行采样时,可以:

  • 均匀地对所有传出方向进行采样,并通过相应的反射分布"函数"进行缩放,
  • 直接根据BRDF进行采样,之后不进行缩放.

介于两者之间的任何事情也是可能的,而且很重要,因为对于复杂的BRDF来说,完全重要的采样是不可能的.
现在,在BRDF实际上是一个dirac delta的情况下,我们看到根据BRDF进行采样变得极其重要:随机抽样,我们必须以概率1忽略贡献(因为BRDF在单个点上得到支持) ,我们在均匀采样方向时选择概率为0,但如果我们确实击中了幸运并获得了反射方向(质量为),那么我们必须将贡献扩大到无限大!如果我们根据BRDF进行采样,我们总是生成反射方向,而不必扩展任何东西(特别是不会遇到任何无穷大).

我的问题是如下:如果它们既是一般措施而不仅仅是功能,那么如何将BRDF"乘以"光的贡献?在考虑BRDF的重要性采样和场景中的灯光分布时,如何在此步骤中正确地"重要性采样"?(灯的采样程序应考虑光分布和BRDF,以避免无穷大.)

理想情况下,人们需要采样程序,这些程序永远不会产生无穷大,无穷大,这应该只是不良采样机制的假象(如上所述).因此,对于随后的四个场景,计算的贡献应始终是有限的:

  • 具有区域光的连续BRDF(例如朗伯漫射材料)
  • 连续BRDF带点光源
  • 具有区域光的离散BRDF(例如完美的镜子)
  • 离散BRDF带点光源

当然,理想情况下,这适用于BRDF和灯光的任何测量,但似乎能够正确地获得上述4种情况是大多数工作的地方.

3d graphics raytracing montecarlo

5
推荐指数
1
解决办法
1751
查看次数

Android中的球形滤镜

我必须在android中的图像上应用球形滤镜,我已附加输入和预期的输出图像.输出图像将从输入图像的平方居中区域进行处理,并将其映射到球体.知道如何在Android中执行此操作.我是否必须使用openGL进行此操作,否则单独的2D转换将完成任务.

输入图像
输出图像

geometry android raytracing opengl-es image-processing

5
推荐指数
1
解决办法
2619
查看次数

如何使用光线追踪器移动相机?

我目前正致力于射线追踪技术,我认为我做得很好; 但是,我还没有覆盖相机.

到目前为止,我使用了位于视图平面之间的平面片段,(-width/2, height/2, 200)并且(width/2, -height/2, 200)[200只是固定数量的z,可以更改].

除此之外,我主要使用相机e(0, 0, 1000),我使用透视投影.

我将光线从点发送e到像素,并在计算像素颜色后将其打印到图像的相应像素.在此输入图像描述

这是我创建的图像.希望您可以通过查看图像来猜测眼睛和视平面的位置.

我的问题从这里开始.是时候移动我的相机,但我不知道如何将2D视图平面坐标映射到规范坐标.那有变换矩阵吗?

我认为该方法需要知道视平面上像素的3D坐标.我不确定这是正确的使用方法.所以你有什么建议?

c++ camera raytracing transformation

5
推荐指数
1
解决办法
1万
查看次数

我对简单视频格式有哪些选择?

我正在玩一个简单的光线跟踪器,我想最终得到一个简短的动画片段.现在我正在将场景渲染为位图.我想最简单的电影格式是可能的,因为我可能必须从头开始实现它(在erlang中).想到GIF动画.还有什么可以提供相同的降压吗?我对保真度或高压缩感兴趣.

PS:我想避免将帧渲染成单个文件,并使用ImageMagick等外部工具将它们组合成GIF或AVI.

video erlang raytracing

5
推荐指数
1
解决办法
1988
查看次数

计算镜面角度的解析方法

我在3D空间中有固定光线LrM可以围绕固定点旋转的镜子 Mrot,这个点不在镜子的同一平面上,换句话说,镜面Mrot与以固定半径为中心的球体相切d.通过该配置,我想找到一个方程,该方程接收点P作为参数,并在3D空间中随着镜子的旋转而产生结果.

我们可以认为镜面没有边界(无限平面),它的旋转没有限制.此外,镜子仅反射在其旋转点的相对侧.

在图象两种情况用不同的输入点P1P2,与它们各自的溶液的角度alpha1alpha2.图片是2D以简化图纸,真实案例是3D. FSD

目前我正在随机旋转计算与镜面的交点,然后计算光线反射并查看距离我想要到达的点(P)的距离.最后迭代一些条件改变旋转直到匹配.

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

有什么想法吗?

注意:我注意到如果镜子围绕它的平面中的一个点(Mrot)旋转并且射线光到达那个点(Mrot)我可以很容易地计算出镜子的角度,但不幸的是不是我的情况.

c++ graphics opencv raytracing computer-vision

5
推荐指数
1
解决办法
998
查看次数

光线跟踪F# - 缺少三角形图中的洞:正确点击?

我已经研究了很长一段时间,并坚持这个错误.

我们在F#中为学校项目建立了一个光线跟踪器.(链接解释Ray tracer:https://blog.frogslayer.com/kd-trees-for-faster-ray-tracing-with-triangles/)

我们为三角形,边界框创建了一个命中函数,一个KD树来处理具有数千个三角形的图形,例如Stanford Bunny和KD树的遍历算法.

我们已经调试了KD树的创建,确保为浮点添加epsilon值,并检查边界框之间的重复项是否被删除.我们确信我们正确地分割了场景中的形状列表,但是我们在尝试渲染的图中得到了"洞".

这是我们的KD树实现,我附上了这些洞的图片:

斯坦福兔子

螺旋

module TmKdtree

open Point
open Shapes

type BoundingBox = BasicShape.BoundingBox 
type Shape = BasicShape.Shape

type TmKdtree =
    | Leaf of BasicShape.Triangle list * BoundingBox 
    | Node of BasicShape.Triangle list * TmKdtree * TmKdtree * BoundingBox  * (string*Point)

let epsilon = 0.001

//Making a boundingbox for the KD-tree, by finding max H point in the boundingboxlist and min l point in the boundingbox list. 
let mkKdBbox (shapes : …
Run Code Online (Sandbox Code Playgroud)

f# raytracing kdtree

5
推荐指数
1
解决办法
247
查看次数

确定点在3D中是否在三角形内

我正在寻找一种关于确定3D中点是否位于三角形内部的方法的认可。

给定形式为R(t)= e + td的射线以及一组三个点T = {V0,V1,V2}的三个维,它们在三个维度上形成三角形,我知道如何找到平面的参数方程,三个点组成,以及如何确定射线是否与该平面相交。最后,如果相交,我想知道相交点是否实际上在三角形边缘的边界内。

请在下面查看我的图片。

在此处输入图片说明

我在想的是,我可以计算出每个边缘向量与从边缘向量中的第一个边缘到该点的向量之间的点积,并检查它们是否均为正。像这样:

在此处输入图片说明

在这种情况下,该点应在三角形内。对?这种确定计算机图形背面的方法不是吗?

graphics raytracing intersection linear-algebra

5
推荐指数
2
解决办法
2189
查看次数