奇怪的线条3D Unity

3

我正在使用Unity 5.4开发一个项目,该项目中的方块相互堆叠在一起。

然而,出现了一些令人讨厌的奇怪线条。在安卓设备上,这些线条比在PC上更频繁地出现。 为了举例说明,我添加了一张图片和一个视频。请放大图片以清楚地看到我所说的那条线。

请问有谁能提供解决此问题的方法?感谢您的帮助。

参考文献:

方块对齐代码片段:

for (int x = 0; x < xSize; x++)
        for (int z = 0; z < zSize; z++)
        {
            Vector3 pos = new Vector3(x, -layerDepth, z);
            InstantiateBlock(pos);
        }

Video link: https://youtu.be/5wN1Wn51d_Y


你能否更新一下你的问题,并附上你是如何定位你的方块的小片段代码? - Zze
请您能否将项目进行压缩并提供下载链接? - Zze
你不能简单地“堆叠块”。这太荒谬了。当然会出现行数。你以为会发生什么? - Fattie
编写Minecraft程序非常困难,这与堆叠方块无关。在Unity中有许多完整的Minecraft套件可用-只需获取一个即可。 - Fattie
你不必这么激烈地反应,Joe Blow。 - Jaswir
3个回答

8
您的对象有缝隙!
这是因为物体之间存在实际或感知上的间隙。有多种原因导致此问题。

1. 浮点数不精确

这可能是因为您将立方体的位置设置为int,但它们具有浮点数维度。这种情况的症状通常是在相机靠近物体时没有白色缝隙,当您逐渐远离物体时,由于浮点数不精确性,它们逐渐出现。 更多信息

大多数这些块似乎完全对齐,从大多数摄像机位置看。 但是,在偶然的位置上,A的位置加上其顶点(0.5,0.5,-0.5)的确切值可能与B对象的位置加上其顶点(-0.5,0.5,-0.5)的确切值略有不同。 结果是Unity显示了一个微小的间隙,在其中可以看到立方体A的阴影侧。

如果您在纸上考虑以下内容: 3 == 1/3 * 3 这在数学上是正确的,但是使用浮点数,1/3 == 0.333333... ,随后 3 * 0.333333... == 0.999999... BINGO!对象之间的随机间隙!
那么如何解决?使用浮点数计算对象的位置。例如,new vector3(1,1,1); 应改为 new vector3(1f,1f,1f);。有关此信息的更多阅读,请尝试 此文章

2. 纹理包围方式

如果您正在对象上使用纹理,请尝试将纹理的Wrap-Mode从wrap更改为clamp,或者尝试增加纹理填充。详细信息

3. 阴影痤疮 -(照明和阴影伪影)

这是阴影中像素任意出现的模式,而它们实际上应该被照亮或未被照亮。

为了防止阴影痘,可以在遮罩映射中添加Bias值,以确保边界线上的像素绝对通过比较,或者在渲染到遮罩映射时确保。 来源.

在Unity中...前往你的光源,然后增加Shadow Type > shadow Bias。我建议将默认值0.05翻倍,然后继续增加直到问题解决。不要将此值调到最大,因为...

不要将Bias值设置得太高,因为阴影周围的区域有时会被错误地照亮。这会导致阴影与GameObject分离,使其看起来像是悬浮在地面上。


我强烈建议不要使用淡入/透明效果,因为正如你发现的那样,它会使你的FPS降低。在互联网上,有几十个人抱怨这个问题-所以不要灰心丧气。这一切都源于浮点精度不准确。我将更新我的答案以更好地解释。 - Zze
你误读了评论“我手动使它们重叠”。这是对Julian答案的反应。这些块在代码中完全对齐。 - Jaswir
然而,我仍然被这个问题困扰: 如何在不影响FPS的情况下摆脱奇怪的线条(允许绕过)。 - Jaswir
@RomeoTheWizard,我刚刚彻底修改了我的答案 - 我现在认为你属于第三种情况。 - Zze
我调整了阴影偏差值,但似乎没有任何影响。 - Jaswir
嗨@Zze!这些都是很好的观点。但是从根本上讲,你不能在游戏引擎中“堆叠块”。当然,你会得到行。 - Fattie

0

你是否使用了不同的方块相互堆叠?你的问题听起来像是方块没有完全贴在一起,导致你看到下一个方块的侧面(这解释了相机Y值的变化:你可能从更高的位置更好地看到侧面)。那个侧面会有不同的照明,并呈现出不同/较轻的颜色。要检查是否存在此问题,请尝试在编辑器中手动略微重叠它们,看看问题是否仍然存在。


是的,这些块是相互对立的。我手动使它们重叠,但那不是问题所在。 也许我需要上传一个视频来更清楚地表达我的意思。 - Jaswir
视频已上传 @Julian Declercq - Jaswir

0
将块设置为动力学可以解决这个问题。问题在于刚体相互碰撞。

你的回答可以通过添加额外的支持信息来改进。请[编辑]以添加进一步的细节,如引用或文档,以便他人可以确认你的答案是否正确。你可以在帮助中心找到更多撰写良好答案的信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接