本帖最后由 贰逼 于 2019-5-23 00:35 编辑 
前言
技术流程
平面扫描
光线追踪
像素获取
UV材质
像素映射
杂项
这是一个精彩的数据包,带给1.13数据包开发尤其是新手以下启示
下载 & 备注
前言
| 
 
 
 | 
2021.12 数据,可能有更多内容
前言
| 
 
 
 | 
| 以下内容为预备知识,你最好能有所了解;即便不了解,你也可以直接去"技术流程"结合本数据包进行学习,但可能会遇到一些阻碍 下面提供的内容大多为专业信息,包含算法。如果你不具备相关的数学知识,只需要知道概念即可,我们在"技术流程"中展开讨论。 | 
| 坐标系相关 
 https://baike.baidu.com/item/世界坐标系 https://baike.baidu.com/item/摄像机坐标系 结合Minecraft,玩家只需要有以下基本认识: https://mc-command.oschina.io/co ... concepts/space.html | 
| 成像相关 
 https://zh.wikipedia.org/wiki/光线追踪 https://en.wikipedia.org/wiki/Ray_tracing_(graphics) https://baike.baidu.com/item/光线追踪 其中只需要了解RayCasting(光线投射)。 在本数据包中,Seth将函数命名为RayTracing(光线追踪),但Seth的函数本质上是光线投射,因为光线追踪还要结合了反射、折射、阴影,而光线投射只是光线追踪的第一个过程。 | 
| 贴图 
 对于Minecraft而言: http://www.mcbbs.net/thread-491597-1-1.html 阅读其中的"方块模型"-"uv" | 
| Function | 
| 最后就是关于数据包Function的内容了,起码要知道函数的调用,函数的递归。 | 
技术流程
| 整个数据包的处理过程如下  | 
| 计分板 & 实体标记 
 
 | 
| 初始化 
 
 
 | 
平面扫描
| 
  用流程表示则如下  
   ("Scan"所遍历的平面与摄像机平面平行) | 
| 源码解析关于execute命令下的at,首先你需要知道 1. 相对性 代码: 
 2. 传递性 代码: 
 利用这两个特性,我们能避免进行复杂的运算而直接让Scan实体在摄像机所捕捉的局部区域平行于摄像机平面移动。 接下来我们复习一下什么叫相对坐标,什么叫局部坐标。  两者都是表示基于实体建立的坐标系下的位置,且~ / ^后面的数值都表示距离。但两者区别在于相对坐标沿用了世界坐标轴,而局部坐标使用的是实体坐标轴;世界坐标轴的三轴与实体旋转无关,而局部坐标的三轴与实体旋转有关。 
 | 
光线追踪
| 
  用流程表示则如下  那么光线投射的目的是什么呢?就是为了找到摄像机扫描位点所对应的在世界坐标系下的绝对位置。 光线投射和平面扫描有何关系?平面扫描借助扫描位点,定义了光线投射的方向。 光线投射结合平面扫描,效果如下   | 
| 源码解析 
 
 
 | 
像素获取
| 在光线投射完成后,我们得到了投射坐标与投射方向。接下来,我们要想办法将投射的结果呈现在地图上。 我们都知道地图(仅讨论scale=0,也就是大小为128*128的地图)的原理是将方块以像素的形式呈现。因此要将结果呈现在地图上,只需获取投射坐标处的方块。你可能立刻会想到直接使用clone,但事实是许多方块共用一个颜色;而且很多方块无法被正确地显示出来。于是Seth想到了将方块按照特征颜色分类,通过以下过程获取像素。  | 
| 源码解析 
 
 
 | 
UV材质
| 
  看着挺麻烦,不过没关系,以下可视化图像协助你理解这个过程。 | 
| 源码解析 
 
 
 
 | 
像素映射
| 
  即北向(x+)方块的高低能实现阴影效果,这也是地图为什么能显示出地形的原理。 像素映射也使用了阶梯式,映射出起伏的方块,绘制出体现远近关系的画面。  | 
| 源码解析 
 
 | 
杂项
- 遮罩层的用途
 目的是预光照更新。而红石灯作为理想选择的原因是它既是非透明方块,同时又不会被地图显示。
 当应用了遮罩层后:
 - 加快处理速度
 由于光照更新被简化了,区块更新变快了。
- 避免暗区
 不会出现Minecraft光照更新错误,因此获取的照片不会出现暗区。
 
 
- 加快处理速度
- 处理速度快的原因
 整个数据包的处理不涉及基于tick的循环,而是调用或递归,利用多个函数构造了多层递归网络。因此整个数据包能在1 tick内执行上千万条命令。
 那么为什么不卡呢?
 递归的1 tick,实际上是后台的1 tick,也就是说前台依旧能运行,只不过是以跳tick的状态运行(因为后台的运行是单线程的,你不能在此时运行其他命令);而且光照预更新后,大大缩短了区块处理的时间,对方块的操作(映射)变得相当快,畅通无阻。
 
这是一个精彩的数据包,带给1.13数据包开发尤其是新手以下启示
| 
 | 
下载 & 备注
| 原始Demo存档 
 Datapack下载 
 解析工程 
 | 
大佬解读,先收藏了
 本帖最后由 brooke1999 于 2019-5-12 22:12 编辑 
大致原理看了一遍有点头绪,只是没想到有人真会去这么做,MC真是万能
主要就是利用玩家视角指向将距离视线方向10blocks的10x10(blocks)正方形区域圈出来,再把这个10x10正方形进一步细分成128x128像素(也就是地图图像精度)大小,遍历每个像素点,往玩家视线方向(^0.2)移动,直到“碰到”方块或达到800步递归限制(160方块远),然后根据碰到的 方块类型&面朝向 来确定颜色&明暗达到3D视觉效果,最终以放置方块+地图来呈现
也不是完全完美,如果能根据递归步数进一步细分画面明暗的话emmmm
之前在油管有看到Seth大佬关于这个原版摄像机的视频,当时没看懂。。。所以说能有这么详细的分析也是辛苦贰逼了,毕竟反混淆+分析原理肯定花了不少时间
总之,tql,awsl
EDIT
别看原理貌似被我一讲挺简单的,但是从想法到构思再到实现、优化等一系列过程却是很不容易的,所以能学习到思考问题的方式才是最重要的。
大致原理看了一遍有点头绪,只是没想到有人真会去这么做,
主要就是利用玩家视角指向将距离视线方向10blocks的10x10(blocks)正方形区域圈出来,再把这个10x10正方形进一步细分成128x128像素(也就是地图图像精度)大小,遍历每个像素点,往玩家视线方向(^0.2)移动,直到“碰到”方块或达到800步递归限制(160方块远),然后根据碰到的 方块类型&面朝向 来确定颜色&明暗达到3D视觉效果,最终以放置方块+地图来呈现
之前在油管有看到Seth大佬关于这个原版摄像机的视频,当时没看懂。。。所以说能有这么详细的分析也是辛苦贰逼了,毕竟反混淆+分析原理肯定花了不少时间
总之,tql,awsl
EDIT
别看原理貌似被我一讲挺简单的,但是从想法到构思再到实现、优化等一系列过程却是很不容易的,所以能学习到思考问题的方式才是最重要的。



























