2D Raytracer 算法

Ein*_*ein 6 java algorithm raytracing vector

我想做一个用于演示目的的编程RayTracerJava同时给出关于光线追踪的一般介绍(还提到 3D,这个 2D 模型应该只是为了更容易理解,并训练我的一般 Java 知识)。

我的问题是,我不知道从哪里开始这整件事。

我会尝试的第一件事是使用向量从给定的坐标(例如鼠标光标的位置)跟踪屏幕上的每个像素。然后我会计算向量是否与多边形相交,然后我会在那里停止向量并只将它绘制到这个特定点。

也许我什至可以通过计算法线来绘制一些阴影,并以较低的强度在另一个方向反射向量。

那么绘制一个向量A = {everypixelonthescreen}到一个特定的Point P并计算交集是个好主意吗?

完成的版本应该看起来像这样:

在此处输入图片说明

Spe*_*tre 12

恐怕您提议的那种光线追踪应用程序比使用真正的 3D 光线追踪器更具误导性。

  • 2D 光线追踪器的使用方式略有不同
  • 这可能会让你的听众很困惑

我会尝试选择更原生的 2D 光线跟踪用法,例如:

  1. 光学模拟

    这用于模拟透镜和反射镜光学。这张图片来自我的一个古老的 2D 光线追踪模拟:

    光学模拟 图片

    1. 存储你的世界

      你有一个多段线+衍射指数形式的透镜,镜子也作为多段线。你有世界衍射指数

    2. 从光源投射 R、G、B 射线

      仅投射重要的或全部投射。使用 Snell 定律模拟光学

    如您所见,色差是可见的(每种颜色都有自己的波长,因此衍射指数不同)。您还可以使用MultiBand 渲染

    我用它来调整定制光学系统。如果您添加拖放功能,您就拥有了Optic Lab

  2. 德军总部演示

    这个伪 3D 游戏使用了 2D 光线投射引擎。参见维基:Wolfenstein_3D_engine。这张图片来自这个链接:

    狼3d

    1. 首先将地板和天花板/天空绘制为 2 个半屏(屏幕除以地平线)
    2. 那么你就有了你的迷宫/世界的 2D 地图(右)

      因此,从您当前位置向所有可见方向投射光线(类似于您的图像,但通常使用 60 度视图)。光线必须以亚像素(单元)精度完成。您的光线击中墙壁(在地图上)的位置获得子像素(单元格)位置。它指示墙壁纹理的哪一部分被击中

    3. 在屏幕上为每个射线命中绘制适当的列(垂直线)

      它的大小和比例由与射线原点的距离决定。应用了鱼眼校正 - 如果我没记错的话,它是通过仅使用垂直距离(距离乘以cos(ray_angle - player_angle))来完成的。

    这是我刚才为了好玩而破坏的一个例子:

    我的 Wolf3D

    它是在 C++ 中使用纯 GDI 完成的(仅使用位图扫描线),根本没有其他第 3 方库。它使用单一纹理、漫反射 + 环境照明、2D 光线投射。有 2 个位图(屏幕、纹理图集)和一个 2D 地图。代码小于 9 KB,包括 rems。它仅由键盘控制(鼠标用于在地图子窗口中编辑迷宫)。

    这是动画GIF示例:

    狼3D

    如果您有兴趣查看此相关 QA: