恐怕您所提出的射线追踪应用程序有点比使用真正的3D射线追踪器更具误导性。
我建议选择更本地的2D射线跟踪使用方式,例如:
光学模拟
用于模拟透镜和镜子光学原理。下面的图片是我古老的2D射线跟踪模拟之一:
储存你的世界
你有由折射率和镜子组成的透镜形状。你可以得到整个世界的折射率
从光源投射R、G、B射线
只投射重要的或全部。使用斯涅尔定律模拟光学原理
如您所见,色差是可见的(每种颜色都有自己的波长,因此折射率不同)。您还可以使用多波段渲染。
我用它来调整自定义光学系统。如果增加拖放功能,您就有了Optic Lab。
Wolfenstein演示
这个伪3D游戏使用了2D射线投射引擎。请参阅维基:Wolfenstein_3D_engine。这张图片来自于该链接:
然后你就有了迷宫/世界的二维地图(右图)
从当前位置向所有可见方向投射光线(类似于您的图片,但通常使用60度视野)。光线必须使用亚像素(单元格)精度进行操作。光线在地图上碰到墙壁时,获得亚像素(单元格)位置。这表明撞到了哪部分墙壁贴图
为每条光线碰撞处在屏幕上绘制相应的列(竖线)
其大小和比例由光线起点到碰撞处的距离决定。鱼眼校正被应用 - 如果我没记错,它是通过仅使用垂直距离来完成的(将距离乘以 cos(ray_angle - player_angle)
)。
这里是我现在闲暇时制作的一个示例:
使用纯GDI(仅使用位图扫描线),没有其他第三方库,用C++编写。它使用单一纹理、漫反射+环境照明、2D光线跟踪。有两个位图(屏幕、纹理集)和单个2D地图。代码包括rems不到9 KByte。它只能通过键盘控制(鼠标用于在地图子窗口中编辑迷宫)。
下面是一个动画GIF示例:
如果您感兴趣,请查看此相关QA: