本帖最后由 贰逼 于 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
别看原理貌似被我一讲挺简单的,但是从想法到构思再到实现、优化等一系列过程却是很不容易的,所以能学习到思考问题的方式才是最重要的。
brooke1999 发表于 2019-5-11 23:16
大致原理看了一遍有点头绪,只是没想到有人真会去这么做,MC真是万能
主要就是利用玩家视角指向将 ...
先针对您提供的改进之处谈一下我的看法:
进一步细分是不可能的,因为地图像素画最多只有四个层次;因为方块特征颜色的缘故,根据地形生成的地图像素画并不如外部生成的像素画色域广,原版下能实现材质和明暗已经是极限了
再就是另外一点感受:
分析很简短其实,但并非想象那么容易;光看每个过程的目的是挺简单的,但实际上实现这些内容不是那么容易的;十分钟看完整篇帖子,且不说我码字做图一个月,实际上Seth开发了近半年更新了四个版本:第一个是界面显示也就是精简版、第二个是利用前一个数据包的原理实现了录制视频、第三个也就是一个月前更新的本数据包、第四个使用本数据原理实现录制gif。徒想没有价值,实现才是值得点赞的
楼主做教程不容易,我这个新手献上一拜。{:10_512:}
MCBBS有你更精彩~
原理简单,但实现起来会很难吧
溜的飞起,必须支持一下!!!
感谢分享!
是图片挂了还是我就看不见qwq
TQL,TQL
脑袋里瞬间想到了某六号的小车车
把主体转换为蠹虫什么的,然后探测玩家微量移动,映射到蠹虫上,再把影像传回玩家手里的地图
想想就刺激啊
脑袋里瞬间想到了某六号的小车车
把主体转换为蠹虫什么的,然后探测玩家微量移动,映射到蠹虫上,再把影像传回玩家手里的地图
想想就刺激啊
厉害呀,真可以做摄像头
感谢楼主分享~
好耶6666666
牛的牛的牛的
这东西真的能做出来?????
MCBBS有你更精彩~
MCBBS有你更精彩~
厉害呀,真可以做摄像头可以弄手机不
原理简单,但实现起来会很难吧
呃,那个录视频用的叫啥名啊
牛蛙,这个挺不错的
看着不错感谢分享
感谢分享 嘎嘎有用
太离谱了,第一次见到这种原版摄像机,完全没想到mc可以搞这个(论算法的重要)
还是印证了那句话,有了mc就有了全部游戏(
还是印证了那句话,有了mc就有了全部游戏(