标签: raytracing

找到射线和多边形之间的交点的最快方法是什么?

正如问题所问的那样。最好用伪代码回答并引用。正确答案应该重视速度而不是简单。

algorithm raytracing polygon

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

简单的光线追踪教程?

几年前,在大学时,我用 C++ 编写了一个光线追踪器,但现在我几乎记不起来了。只是为了好玩,我决定再次尝试编写光线追踪器,这次是用 C# 编写。但遗憾的是,我正在努力开始从相机坐标到世界坐标的转换。

谁能给我推荐一套关于从头开始编写光线追踪器的好教程?我的数学知识非常基础,所以我需要重新学习矩阵乘法,计算出屏幕上的点在 3D 空间中的位置,以便通过它投射光线。

我认为我可以解决形状和阴影部分的交叉点,但我需要回到相机翻译的基础知识。

谢谢!

c# math 3d raytracing matrix

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

光线跟踪:仅使用单光线而不是反射和折射光线

目前我正在试图理解由凯文Beason(smallpt:开发的光线追踪http://www.kevinbeason.com/smallpt/),如果我理解正确的代码,他随机选择将反射或折射的光线(如表面既反射又折射.

第71-73行:

return obj.e + f.mult(depth>2 ? (erand48(Xi)<P ?   // Russian roulette
radiance(reflRay,depth,Xi)*RP:radiance(Ray(x,tdir),depth,Xi)*TP) :
radiance(reflRay,depth,Xi)*Re+radiance(Ray(x,tdir),depth,Xi)*Tr);
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释只投射一条光线而不是两条光线的缺点吗?我从来没有听说过这种技术,我很好奇这种权衡是什么,因为它会导致巨大的复杂性降低.

c c++ trace raytracing

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

Optix在有效负载中动态调整大小的数组

有没有办法在optix中声明动态大小的数组有效负载?我用Google搜索并阅读了Optix文档,但却发现Optix不允许使用malloc.我有什么方法可以做以下的事情吗?

struct PerRayData_radiance
{
 float3 result;
 float  importance;
 int depth;
 float stuff[N];
};
Run Code Online (Sandbox Code Playgroud)

我根据一些用户参数将数组大小调整为N大小.

我尝试在NVIDIA论坛上搜索过去的问题,但由于某些安全问题,它似乎已被关闭.

cuda raytracing nvidia optix

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

平滑地绘制二维散点

主要问题:

我写了一个小的光线追踪代码。这称为前向光线追踪,因此光线实际上是在光源处产生的,传播到唯一的镜子并被反射。随后,我计算每条射线与我选择的平面(我称之为探测器)的交点。我在探测器上得到的,将每个命中打印为一个像素,是(x,y)的散点图。像这个:

import matplotlib.pyplot as plt
import numpy as np
import random

x = np.zeros(1000)
y = np.zeros(1000)
for i in range(len(x)):
    x[i] = random.random()
    y[i] = random.random()

plt.plot(x,y,'k,')
plt.show()
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找一种方法将点击的密度分布(强度)表示为平滑图像,就像这个一样。

因此每个像素的灰度应该与周围斑块的密度相对应。但看起来像我需要的一切都是针对像 z=f(x,y) 这样的 3d 数组。

还尝试了 hexbin(),但它不够平滑,对于非常小的垃圾箱,它变得太慢,而且只类似于我所拥有的。

那么有什么我可以使用的吗?

次要问题:

我以某种方式需要添加另一个维度,因为我对入射光线的平行性感兴趣。一种选择是将其定义如下:

  1. 计算 a + a*b,其中:

a = 入射光线与探测器法线之间的角度

b = 入射光线与 yz 平面之间的角度(光线大致平行于该平面传播)

  1. 该数量的平均值

  2. 每次命中的平均值的偏差

我想通过向灰度添加颜色将这两种信息合并到一个图中。这可行吗?

我是编程新手,任何提示、解释或替代想法将不胜感激。

python raytracing matplotlib

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

路径追踪:计算完美镜面反射时为什么没有余弦项?

我一直在查看 Kevin Beason 的路径跟踪器“smallpt”(http://www.kevinbeason.com/smallpt/),并有一个关于镜面反射计算的问题(第 62 行)。

我对渲染方程(http://en.wikipedia.org/wiki/Rendering_equation)的理解是,要计算差分区域的出射辐射,您需要对差分区域上方半球中每个差分立体角的入射辐射进行积分,由 BRDF 和余弦因子加权,余弦因子的目的是减少对以更多掠射角入射光降落在该区域的差分辐照度的贡献(因为这些角度的光将传播到更大的区域,这意味着所讨论的差异区域将接收更少的这种光)。

但是在 smallpt 代码中,这个余弦因子不是第 62 行镜像反射计算的一部分。(它也从漫反射计算中省略,但我相信这是因为漫射光线是用余弦加权重要性采样选择的,这意味着不需要显式乘以余弦因子)。

我的问题是为什么镜面反射计算不需要余弦因子?如果入射辐照度相同,但入射角变得更加掠过,那么无论是考虑漫反射还是镜面反射,落在差分区域的辐照度都不会降低吗?

reflection graphics rendering raytracing montecarlo

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

Python光线跟踪会在靠近相机时扭曲对象形状

问题

我最近在这个链接中找到了一个很棒的纯Python-ray光线跟踪脚本,并为了更方便的功能而扩展了一点.然而,有时它会扭曲物体的形状,我想知道有光线追踪/ 3D经验的人是否可能有任何线索可能导致它?

一些信息

我正在测试的场景包括一个地面平面,顶部有三个彩色球体.当相机从上方/角度和一定距离俯视场景时,它会产生美观的场景(参见前两张照片); 然而,当相机靠近地面并靠近物体时,球体最终会改变它们的形状并变成椭圆形,好像它们被拉向天空一样(见第三张图片).请注意,带有扭曲球体的第三张照片中的相机有点颠倒,这是因为我还在弄清楚如何控制相机而不确定如何在发生这种情况时"直立"旋转它.它似乎自动地朝向球体/光源所在的一般区域看,并且只有当我改变一些参数时它才会朝不同的方向看.

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

我仍然试图破译并理解我发现的原始代码中的内容以及我的代码所基于的内容,所以我不知道,但它可能是原始作者采用光线追踪的方法或方法.我已经附加了我的模块脚本的整个代码,当你按F5时,如果有人接受挑战,它应该运行.图像渲染需要PIL,如果您想要使用摄像机的位置,只需查看Camera类,并在"normaltest"功能中更改其选项.

更新

有人指出,在运行脚本时,它不会在第三张图像中重现问题.我现在已经更改了正常测试功能的摄像头位置,以便重现问题(请参阅新的第四张图像,看看它应该是什么样子).如果你想知道为什么光似乎是从球体中射出来的,那么我就把光源放在它们之间的某个地方.

我开始认为问题在于相机而我完全不了解它.

  • 相机选项变焦,偏光和偏光可能不符合他们的名字所暗示的; 这就是我根据他们改变它们时所做的事情来命名它们的方式.最初它们不是变量,而是在计算中必须手动更改的常量nr.具体地,它们用于通过renderScene函数中的线218上的场景定义和产生光线.
  • 例如,有时当我更改变焦值时,它也会改变相机的方向和位置.
  • 有点奇怪的是,在原始代码中,相机被定义为没有方向的点(xangle和yangle变量最初只是静态nrs,没有定义它们的选项),并且几乎总是开始向对象自动查看.
  • 我无法找到一种方法来"旋转"/倾斜相机本身.

还要尝试将相机从当前的z坐标2增加到5的az,这是一个非常小的变化,但它会使失真看起来更好看(尽管仍然很糟糕),因此接近地面或角度的变化随之而来它似乎发挥了一些作用.

"""
Pure Python ray-tracer :)
taken directly from http://pastebin.com/f8f5ghjz with modifications
another good one alternative at http://www.hxa.name/minilight/
some more equations for getting intersection with other 3d geometries, https://www.cl.cam.ac.uk/teaching/1999/AGraphHCI/SMAG/node2.html#SECTION00023200000000000000
"""

#IMPORTS
from math import sqrt, pow, pi
import time
import PIL,PIL.Image

#GEOMETRIES
class Vector( object ):

    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z

    def dot(self, b):
        return self.x*b.x + …
Run Code Online (Sandbox Code Playgroud)

python 3d graphics raytracing

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

三角形的表面积启发式(SAH)kd树-平面单元

我已经基于“ 关于建立用于射线跟踪的快速kd树”的论文,以及 Wald和Havran 在O(N log N)中进行的研究,实现了SAH kd树。请注意,最后我还没有完成他们的拼接和合并建议,只是为了加快树的构建速度,只是SAH部分。

我正在使用轴对齐的多维数据集测试该算法,其中每个面都分成两个三角形,所以我N = 12总共有三角形。左下角的顶点(即最靠近轴的顶点)实际上位于原点。

5个单位的立方体,每个面分成2个三角形

Face    Triangle
----------------
Front:  0, 1
Left:   6, 7
Right:  2, 3
Top:    4, 5
Bottom: 10, 11
Back:   8, 9
Run Code Online (Sandbox Code Playgroud)

假设节点遍历成本Ct = 1.0和交叉成本Ci = 10.0。我们首先发现不分裂的成本为Cns = N * Ci = 12 * 10.0 = 120.0

现在,我们依次遍历每个轴,并逐步遍历候选拆分平面,以查看拆分成本是否更便宜。第一个分割平面是p = <x,0>。我们有Nl = 0Np = 2而且Nr = 10(也就是三角形的上左边的数字,在飞机上,并以平面的右侧)。平面中的两个三角形分别是数字6和7(左侧)。其他所有人都在右边。

SAH(p,V,Nl,Nr,Np)现在执行该功能。这需要分割平面,V要分割的体素以及左/右/平面三角形的数量。它计算出命中左(平坦)体素Pl = …

algorithm 3d raytracing kdtree

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

光线追踪球体反射bug

我正在尝试实现光线跟踪算法,我在计算球形物体的反射光线时遇到了一些麻烦.对于某些特定的光线,反射光线似乎只是通过并与跟踪光线共线.贝娄是我如何记录射线 - 球体交叉点:

bool Sphere::intersectLocal(const ray & r, isect & i) const {
    Vec3d P = r.getPosition();
    Vec3d D = r.getDirection();
    //D.normalize();
    double a = dot(D, D);
    double b = 2 * dot(P, D);
    double c = dot(P, P) - 1;
    double delta = b * b - 4 * a * c;
    if (delta < 0)
        return false;
    if (delta == 0) {
        double t = -b / 2 * a;
        Vec3d Q = P + t * D; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl raytracing

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

了解 C++ constexpr 性能

我最近使用constexprC++17 的函数编写了一个编译时光线追踪器。完整的源代码可以在这里看到。此问题的相关代码如下所示:

constexpr auto image = []() {
        StaticImage<image_width, image_height> image;

        Camera camera{Pointf{0.0f, 0.0f, 500.0f},
                      Vectorf{0.0f},
                      Vectorf{0.0f, 1.0f, 0.0f},
                      500.0f};

        std::array<Shapes, 1> shapes_list{Sphere{Pointf{0.0f}, 150.0f}};
        std::array<Materials, 1> materials_list{DefaultMaterial{}};
        ShapeContainer<decltype(shapes_list)> shapes{std::move(shapes_list)};
        MaterialContainer<decltype(materials_list)> materials{
            std::move(materials_list)};

        SphereScene scene;
        scene.set_camera(camera);

        Renderer::render(scene, image, shapes, materials);
        return image;
    }();
Run Code Online (Sandbox Code Playgroud)

其中每个这里示出的类(StaticImageCameraShapesMaterialsShapeContainerMaterialContainer,和SphereScene)由完全constexpr的功能。Renderer::renderconstexpr负责循环图像中的每个像素,将光线射入场景,并设置相应的颜色。

使用当前的设置和 512x512 的图像,在发布模式下使用 MSVC 16.9.2,编译器需要大约 35 分钟来完成生成图像。在此过程中,其内存使用量上升到最终使用近 64GB RAM 的程度。

所以,我的问题是:为什么编译时间和内存使用率这么高?

我的理论是编译时间的部分原因是调用堆栈的复杂性(即大量模板、CRTP 和深度),所以我尝试通过删除几个模板来稍微简化调用堆栈( …

c++ raytracing constexpr c++17

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