我想在RayTracer
中进行程序化Java
用于演示目的,同时提供有关光线跟踪的一般介绍(也提到3D,这个2D模型应该只是为了更容易理解和训练我的一般Java知识)。
我的问题是,我不知道从哪里开始这一切。
我要尝试的第一件事是使用矢量从给定坐标(例如我的鼠标光标的位置)跟踪屏幕上的每个像素。然后我会计算向量是否与多边形相交,然后我会在那里停止向量并将其绘制到这个特定点。
也许我甚至可以通过计算法线来绘制一些阴影,并以较低的强度反射另一个方向的矢量。
那么从A = {everypixelonthescreen}
到特定Point P
绘制一个向量并计算交叉点会是个好主意吗?
完成的版本应该看起来像这样:
答案 0 :(得分:4)
我担心你提出的这种光线跟踪应用程序会比使用真正的3D光线跟踪器更具误导性。
我会尝试选择更多本机2D光线跟踪用法,如:
光学模拟
这用于模拟镜头和镜子光学器件。这里来自我的一个古老的2D射线追踪模拟图像:
存储您的世界
你有镜头形式的折线+衍射指数和镜子也作为折线。你有世界衍射指数
从光源投射R,G,B射线
仅投放重要的或全部。使用Snell定律模拟光学
正如您所见,色度误差是可见的(每种颜色都有自己的波长,因此衍射指数不同)。您也可以使用MultiBand rendering。
如果您添加drag&drop功能,我用它来调整自定义光学系统光学实验室
Wolfenstein演示
这个伪3D游戏使用2D射线投射引擎,请参阅Wiki: Wolfenstein_3D_engine。此图片来自此链接:
然后你得到了迷宫/世界的二维地图(右)
因此,从所有可见方向的当前位置投射光线(类似于您的图像,但通常使用60度视图)。光线必须以亚像素(单元)精度完成。光线撞击墙壁(在地图上)获取子像素(单元格)位置。它表示墙壁纹理的哪个部分被击中
在屏幕上为每次雷击
绘制适当的列(垂直线)它的大小和比例由距离形成射线原点确定。如果我的记忆服务是通过仅使用垂直距离(乘以cos(ray_angle-player_angle)
的距离)来进行鱼眼校正。
这里是我刚才玩得很开心的例子:
使用纯GDI(仅使用位图扫描线)在C ++中完成,根本没有其他第3方库。它使用单一纹理,漫射+环境照明,2D光线投射。有2个位图(屏幕,纹理图集)和单个2D地图。代码少于9 KB,包括rems。它仅由键盘控制(鼠标用于编辑地图子窗口中的迷宫)。
这里有动画 GIF 示例:
如果您有兴趣,请参阅相关的质量保证:
答案 1 :(得分:0)
据我了解,这个问题的处理方式不同。给定一些位置(鼠标的当前位置或类似的东西),将在某个给定角度的范围内跟踪环境(如90度,在图片中看起来像360度)。在所需的角度分辨率中,来自初始位置的光线与所提到的多边形相交。渲染最近的交叉点。这种方法应该呈现出可见的点。从给定的位置。