2D光线跟踪器的算法

时间:2015-09-22 12:19:22

标签: java algorithm vector raytracing

我想在RayTracer中进行程序化Java用于演示目的,同时提供有关光线跟踪的一般介绍(也提到3D,这个2D模型应该只是为了更容易理解和训练我的一般Java知识)。

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

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

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:4)

我担心你提出的这种光线跟踪应用程序会比使用真正的3D光线跟踪器更具误导性。

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

我会尝试选择更多本机2D光线跟踪用法,如:

  1. 光学模拟

    这用于模拟镜头和镜子光学器件。这里来自我的一个古老的2D射线追踪模拟图像:

    optic sim

    1. 存储您的世界

      你有镜头形式的折线+衍射指数和镜子也作为折线。你有世界衍射指数

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

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

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

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

    4. Wolfenstein演示

      这个伪3D游戏使用2D射线投射引擎,请参阅Wiki: Wolfenstein_3D_engine。此图片来自此链接:

      wolf3d

      1. 首先绘制地板和天花板/天空作为2个半屏幕(屏幕除以地平线)
      2. 然后你得到了迷宫/世界的二维地图(右)

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

      3. 在屏幕上为每次雷击

        绘制适当的列(垂直线)

        它的大小和比例由距离形成射线原点确定。如果我的记忆服务是通过仅使用垂直距离(乘以cos(ray_angle-player_angle)的距离)来进行鱼眼校正。

      4. 这里是我刚才玩得很开心的例子:

        my Wolf3D

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

        这里有动画 GIF 示例:

        Wolf3D

        如果您有兴趣,请参阅相关的质量保证:

答案 1 :(得分:0)

据我了解,这个问题的处理方式不同。给定一些位置(鼠标的当前位置或类似的东西),将在某个给定角度的范围内跟踪环境(如90度,在图片中看起来像360度)。在所需的角度分辨率中,来自初始位置的光线与所提到的多边形相交。渲染最近的交叉点。这种方法应该呈现出可见的点。从给定的位置。