我正在使用纯Python构建一个简单的Python光线跟踪器(仅仅是为了它),但我遇到了障碍.
我的场景设置目前是这样的:
0, -10, 0沿y轴指向.1位于的球体0, 0, 0.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) 我有一个由点顶点(XYZ)和最终三角形面组成的3D模型.使用OpenGL或相机视图矩阵投影我可以将3D模型投影到2D平面,即视图窗口或具有m*n分辨率的图像.
问题是如何确定来自2D投影计划的像素与其与原始3D模型相对应的顶点(或面)之间的对应关系.
也就是说,
2D投影中给定像素的3D模型中最接近的顶点是什么?
这听起来像是在openGL或光线追踪问题中挑选.是否有任何简单的解决方案?
通过光线跟踪的想法,它实际上是关于从视点找到与光线相交的第一个顶点/面.有人能给我看一些教程或例子吗?我想找到一个独立于使用OpenGL的算法.
我去年参加了计算机图形学课程(研究生水平).我们花了一个学期构建光线跟踪器并为其添加功能.我们在C++中从头开始构建所有内容,大概是为了更好地理解底层数据结构和算法.这是我的问题:如果我想在计算机图形学的工业中找到一份工作,如果我从头开始构建一切像这样的光线跟踪,人们会认为我疯了吗?是否有类似于OpenGL的图形库和框架支持光线跟踪?OpenGL本身是否支持光线跟踪?
我的课程教授是计算机图形学理论和相关数学基础知识的专家,但对专业人员用于计算机图形学的现代框架和库没有任何理解.她更像是一名科学家而非一名修炼者.
如果我使用库来帮助我进行光线跟踪,那么如果它支持将计算分发到计算机集群可能会很好.我也可以使用图书推荐,如果你知道一个可以帮助我理解这个差距的书.
试图实现蒙特卡罗路径追踪,我在光采样程序中遇到了麻烦.
通常,程序如下:
我遗漏了一些关于如何随机选择事物的细节,但暂时不介意(参见例如"分布光线跟踪中的灯具采样").
我认为问题在于,BRDF和光源中的光分布都不是实际功能,而是测量.
例如,对于每个入射角,完美反射镜的BRDF是反射方向上的dirac delta"函数"(即,在一点上支持的度量,在该点处质量为1).类似地,与密度函数相反,点光(与区域光相对)由狄拉克三角洲建模.
直接区分似乎很重要,因为它允许适当的重要性抽样.例如,在对BRDF进行采样时,可以:
介于两者之间的任何事情也是可能的,而且很重要,因为对于复杂的BRDF来说,完全重要的采样是不可能的.
现在,在BRDF实际上是一个dirac delta的情况下,我们看到根据BRDF进行采样变得极其重要:随机抽样,我们必须以概率1忽略贡献(因为BRDF在单个点上得到支持) ,我们在均匀采样方向时选择概率为0,但如果我们确实击中了幸运并获得了反射方向(质量为),那么我们必须将贡献扩大到无限大!如果我们根据BRDF进行采样,我们总是生成反射方向,而不必扩展任何东西(特别是不会遇到任何无穷大).
我的问题是如下:如果它们既是一般措施而不仅仅是功能,那么如何将BRDF"乘以"光的贡献?在考虑BRDF的重要性采样和场景中的灯光分布时,如何在此步骤中正确地"重要性采样"?(灯的采样程序应考虑光分布和BRDF,以避免无穷大.)
理想情况下,人们需要采样程序,这些程序永远不会产生无穷大,无穷大,这应该只是不良采样机制的假象(如上所述).因此,对于随后的四个场景,计算的贡献应始终是有限的:
当然,理想情况下,这适用于BRDF和灯光的任何测量,但似乎能够正确地获得上述4种情况是大多数工作的地方.
我必须在android中的图像上应用球形滤镜,我已附加输入和预期的输出图像.输出图像将从输入图像的平方居中区域进行处理,并将其映射到球体.知道如何在Android中执行此操作.我是否必须使用openGL进行此操作,否则单独的2D转换将完成任务.


我目前正致力于射线追踪技术,我认为我做得很好; 但是,我还没有覆盖相机.
到目前为止,我使用了位于视图平面之间的平面片段,(-width/2, height/2, 200)并且(width/2, -height/2, 200)[200只是固定数量的z,可以更改].
除此之外,我主要使用相机e(0, 0, 1000),我使用透视投影.
我将光线从点发送e到像素,并在计算像素颜色后将其打印到图像的相应像素.
这是我创建的图像.希望您可以通过查看图像来猜测眼睛和视平面的位置.
我的问题从这里开始.是时候移动我的相机,但我不知道如何将2D视图平面坐标映射到规范坐标.那有变换矩阵吗?
我认为该方法需要知道视平面上像素的3D坐标.我不确定这是正确的使用方法.所以你有什么建议?
我正在玩一个简单的光线跟踪器,我想最终得到一个简短的动画片段.现在我正在将场景渲染为位图.我想最简单的电影格式是可能的,因为我可能必须从头开始实现它(在erlang中).想到GIF动画.还有什么可以提供相同的降压吗?我对保真度或高压缩感兴趣.
PS:我想避免将帧渲染成单个文件,并使用ImageMagick等外部工具将它们组合成GIF或AVI.
我在3D空间中有固定光线Lr和M可以围绕固定点旋转的镜子 Mrot,这个点不在镜子的同一平面上,换句话说,镜面Mrot与以固定半径为中心的球体相切d.通过该配置,我想找到一个方程,该方程接收点P作为参数,并在3D空间中随着镜子的旋转而产生结果.
我们可以认为镜面没有边界(无限平面),它的旋转没有限制.此外,镜子仅反射在其旋转点的相对侧.
在图象两种情况用不同的输入点P1和P2,与它们各自的溶液的角度alpha1和alpha2.图片是2D以简化图纸,真实案例是3D.

目前我正在随机旋转计算与镜面的交点,然后计算光线反射并查看距离我想要到达的点(P)的距离.最后迭代一些条件改变旋转直到匹配.
显然这是一种矫枉过正,但我无法弄清楚如何以分析方式对其进行编码.
有什么想法吗?
注意:我注意到如果镜子围绕它的平面中的一个点(Mrot)旋转并且射线光到达那个点(Mrot)我可以很容易地计算出镜子的角度,但不幸的是不是我的情况.
我已经研究了很长一段时间,并坚持这个错误.
我们在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) 我正在寻找一种关于确定3D中点是否位于三角形内部的方法的认可。
给定形式为R(t)= e + td的射线以及一组三个点T = {V0,V1,V2}的三个维,它们在三个维度上形成三角形,我知道如何找到平面的参数方程,三个点组成,以及如何确定射线是否与该平面相交。最后,如果相交,我想知道相交点是否实际上在三角形边缘的边界内。
请在下面查看我的图片。
我在想的是,我可以计算出每个边缘向量与从边缘向量中的第一个边缘到该点的向量之间的点积,并检查它们是否均为正。像这样:
在这种情况下,该点应在三角形内。对?这种确定计算机图形背面的方法不是吗?
raytracing ×10
graphics ×4
c++ ×3
3d ×2
opengl ×2
android ×1
camera ×1
erlang ×1
f# ×1
frameworks ×1
geometry ×1
hittest ×1
intersection ×1
kdtree ×1
montecarlo ×1
opencv ×1
opengl-es ×1
projection ×1
python ×1
vector ×1
video ×1