加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 2D光线跟踪器的算法

发布时间:2020-12-15 07:36:45 所属栏目:Java 来源:网络整理
导读:我想用 Java编写一个程序化的RayTracer用于演示目的,同时给出一般的Ray Tracing演示文稿(也提到3D,这个2D模型应该只是为了更容易理解,并培养我的一般Java知识). 我的问题是,我不知道从哪里开始这整个事情. 我要尝试的第一件事是使用矢量来跟踪给定坐标(例如
我想用 Java编写一个程序化的RayTracer用于演示目的,同时给出一般的Ray Tracing演示文稿(也提到3D,这个2D模型应该只是为了更容易理解,并培养我的一般Java知识).

我的问题是,我不知道从哪里开始这整个事情.

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

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

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

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

enter image description here

解决方法

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

> 2D射线追踪器的使用方式略有不同
>这可能会让您的观众感到很困惑

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

>光学模拟

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

optic sim

>存储你的世界

你有透镜以折线衍射指数和镜子的形式作为折线.你有世界衍射指数
>从光源投射R,G,B射线

仅投出重要的或全部.使用Snell定律来模拟光学

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

如果你添加了光学实验室的drag&drop功能,我用它来调整自定义光学系统
> Wolfenstein演示

这个伪3D游戏使用2D射线投射引擎见Wiki: Wolfenstein_3D_engine.这张图片来自这个链接:

wolf3d

>首先绘制地板和天花板/天空为2半屏幕(屏幕除以地平线)
>然后你得到你的迷宫/世界的2D地图(右)

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

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

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

my Wolf3D

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

这里有动画GIF示例:

Wolf3D

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

> Wolfenstein with variable height of cells

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读