Ein*_*ein 6 java algorithm raytracing vector
我想做一个用于演示目的的编程RayTracer,Java同时给出关于光线追踪的一般介绍(还提到 3D,这个 2D 模型应该只是为了更容易理解,并训练我的一般 Java 知识)。
我的问题是,我不知道从哪里开始这整件事。
我会尝试的第一件事是使用向量从给定的坐标(例如鼠标光标的位置)跟踪屏幕上的每个像素。然后我会计算向量是否与多边形相交,然后我会在那里停止向量并只将它绘制到这个特定点。
也许我什至可以通过计算法线来绘制一些阴影,并以较低的强度在另一个方向反射向量。
那么绘制一个向量A = {everypixelonthescreen}到一个特定的Point P并计算交集是个好主意吗?
完成的版本应该看起来像这样:
Spe*_*tre 12
恐怕您提议的那种光线追踪应用程序比使用真正的 3D 光线追踪器更具误导性。
我会尝试选择更原生的 2D 光线跟踪用法,例如:
光学模拟
这用于模拟透镜和反射镜光学。这张图片来自我的一个古老的 2D 光线追踪模拟:
存储你的世界
你有一个多段线+衍射指数形式的透镜,镜子也作为多段线。你有世界衍射指数
从光源投射 R、G、B 射线
仅投射重要的或全部投射。使用 Snell 定律模拟光学
如您所见,色差是可见的(每种颜色都有自己的波长,因此衍射指数不同)。您还可以使用MultiBand 渲染。
我用它来调整定制光学系统。如果您添加拖放功能,您就拥有了Optic Lab。
德军总部演示
这个伪 3D 游戏使用了 2D 光线投射引擎。参见维基:Wolfenstein_3D_engine。这张图片来自这个链接:
那么你就有了你的迷宫/世界的 2D 地图(右)
因此,从您当前位置向所有可见方向投射光线(类似于您的图像,但通常使用 60 度视图)。光线必须以亚像素(单元)精度完成。您的光线击中墙壁(在地图上)的位置获得子像素(单元格)位置。它指示墙壁纹理的哪一部分被击中
在屏幕上为每个射线命中绘制适当的列(垂直线)
它的大小和比例由与射线原点的距离决定。应用了鱼眼校正 - 如果我没记错的话,它是通过仅使用垂直距离(距离乘以cos(ray_angle - player_angle))来完成的。
这是我刚才为了好玩而破坏的一个例子:
它是在 C++ 中使用纯 GDI 完成的(仅使用位图扫描线),根本没有其他第 3 方库。它使用单一纹理、漫反射 + 环境照明、2D 光线投射。有 2 个位图(屏幕、纹理图集)和一个 2D 地图。代码小于 9 KB,包括 rems。它仅由键盘控制(鼠标用于在地图子窗口中编辑迷宫)。
这是动画GIF示例:
如果您有兴趣查看此相关 QA: