【问题标题】:Algorithm for 2D Raytracer二维光线追踪器的算法
【发布时间】:2015-09-22 12:19:22
【问题描述】:

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

我的问题是,我不知道从哪里开始。

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

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

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

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

【问题讨论】:

    标签: java algorithm vector raytracing


    【解决方案1】:

    恐怕你提出的那种光线追踪应用程序比使用真正的 3D 光线追踪器更容易产生误导。

    • 2D 光线追踪器的使用方式略有不同
    • 这可能会让您的观众非常困惑

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

    1. 光学模拟

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

      1. 存储你的世界

        你有一个折线 + 衍射指数形式的镜头和折线形式的镜子。你有世界衍射指数

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

        只投射重要的或全部。使用斯涅尔定律模拟光学

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

      我用它来调整自定义光学系统。如果您添加drag & drop 功能,您就拥有了光学实验室

    2. 德军总部演示

      这个伪 3D 游戏使用了 2D 光线投射引擎。见Wiki: Wolfenstein_3D_engine。此图片取自此链接:

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

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

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

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

      下面是我刚才玩的一个例子:

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

      这里是动画GIF示例:

      如果您有兴趣,请查看相关的 QA:

    【讨论】:

    【解决方案2】:

    据我了解,该问题的处理方式会有所不同。给定某个位置(鼠标的当前位置或类似位置),将在某个给定角度的范围内从那里追踪环境(例如 90 度,在您的图片中这看起来像 360 度)。在所需的角度分辨率中,来自初始位置的光线与上述多边形相交。渲染最近的交点。这种方法应该渲染从给定位置“可见”的点。

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 2012-11-13
      • 2014-12-30
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多