本帖最后由 Cat_Anchor 于 2025-11-21 17:42 编辑
前情提要:“但是很可惜,最后我做出来的结果,还是存在一定的深度冲突的问题,而且现在我没有时间修复它。……”
现在我基本上修复了这个深度冲突问题! 修复的思路很简单,可是过程却出乎意料,其中一些事情到现在我也没法解释。
当时,我以为这只是一些简单的计算。算出模型中偏差的 UV 值,再调整那些面的 UV 就好了;可是今天我实际操作的时候,才发现没那么简单。 今天早上,在去学校的路上,我首先修复了面的 UV 错位问题。这相对好修复,对应着模型与纹理,一个一个调整就行了;离开学校的路上,我又开始修复最终的深度冲突问题。 我突然发现,这个偏差的 UV 值非常奇怪,似乎不是可以计算出来的;即使尝试多次,我也搞不清楚怎么调整 UV 才能让深度冲突消失。有那么一瞬间,我甚至认为这不是通过调整 UV 就能解决的问题;但是接下来的一瞬间,我发现了一个完美的位置和角度。 在这个位置和角度,模型中一个面的一个角落的一侧的深度冲突恰好消失了。这不是因为模型自己把自己修好了,而是因为,在特定情况下,深度冲突会短暂地看似已经解决了。实际上并没有解决,只要移动相机位置和角度,深度冲突就会立刻重新出现。但是我抓住了这个完美的位置和角度,尝试一点点移动其中一个面的 UV;不行,没什么变化。再移动另一个面的 UV,这好像是解决问题的关键。我继续调整 UV 的大小,直到两个面的纹理中的像素互相对齐——这就行了! 再看这时候 UV 的大小,我调整的数值就是—— 0.3
为什么是 0.3?我不知道,不过我确实知道一件事,那就是这个数值能修复最后的深度冲突问题,让我头疼不已的最终的大问题。 于是很快,所有 UV 都开始了“0.3 化”,UV 坐标要么是加上了 0.3,要么是减去了 0.3,这样,我就成功修复了深度冲突问题。
可是……到底为什么是 0.3?可不可以是 0.33333 循环?我编辑了导出的模型数据,把里面的偏移量改成了 0.33333。再导入编辑程序,我发现这样改之后,交界处出现了一些微小的细缝。看来,那个理想的偏移量并不是 0.33333 循环。我又回到一开始的模型,仔细观察,可以发现其实它的表面也有细缝——其实不是细缝,而是像素没有对齐导致的阶梯状纹理。对比之后,我认为理想偏移量比 0.33333 循环小,而且也比 0.3 小一些。 也就是说,这个偏移量比 0.3 还要小,但是根据之前的两组数据,小得不多;这个问题还与数字 7 有关。我凭借直觉,尝试把偏移量设为 2 / 7,也就是 0.285714 循环。导入编辑程序时,我想,这应该就是那个理想的偏移量了。 然而不是。 偏移量,比它还要大。
也许我们可以尝试逼近这个理想值。我取了 0.285714 循环与 0.3 的中间值,大约是 0.29285714,发现理想值比它大;这时候,继续求理想值已经失去了意义,现有的 0.3 的方案看来已经足够接近理想值了。 而且我还有一个新发现,那就是在透视投影的情况下,0.3 的偏移量几乎就是完美的,看不出来有什么偏差;只有换到正交投影,放大到渲染精度丢失的时候,我们才能注意到那个瑕疵。 最后,我把理想偏移量估计为 0.296428571,其中 428571 是循环的。在实际文件中,我还是采用 0.3 的方案。 这件事情,终于告一段落了。
其实说到底,不透明方块连接纹理的难题真的被攻破了吗?可能没有,“纸盒”这个方块只是一个特例,我只是可以这样设计它的模型,最后还留下了上文的疑问。而且对于其他类型的方块,我们还是需要继续攻克这个难题。 经过我的估计,也许骨骼可见性与方块剔除的综合运用可以解决这个问题,把一些 Molang 表达式转为方块剔除规则可能可以绕开相关限制。如果处理得当,我们基本可以还原出 Java 版的纹理连接效果,然而大概率无法做到运行效率很高,尤其是同时修改大量方块时。 但是,归根到底,我已经在万象添补0.17.8 中修复了纸盒相关的漏洞,接下来我们可以继续开发其他内容了。
(突然发现的好玩的东西↓)
H2S2O3 ==== S↓ + SO2↑ + H2O
2 MnO4- + 5 H2C2O4 + 6 H+ ==== 2 Mn2+ + 10 CO2↑ + 8 H2O |
|