在Unity代码库中,我看到了:
// the game object currently has no mesh attached
MeshFilter mFilter = gameObject.AddComponent<MeshFilter>();
gameObject.AddComponent<MeshRenderer>();
// no problem so far
mFilter.mesh = MakeASmallQuadMesh(0.1f);
// great stuff
mFilter.mesh.bounds = SomeSpecificBounds();
// what ?
函数“ MakeASmallQuadMesh”具有用于制作网格的通常完全正常的代码,因此
Mesh mesh = new Mesh();
mesh.SetVertices(verts);
mesh.SetIndices(indices);
mesh.SetUVs(0, uvs);
mesh.RecalculateNormals();
mesh.RecalculateBounds();
return mesh;
在那里没有后顾之忧。它的四边形为10厘米宽。
那那行代码呢
mFilter.mesh.bounds = SomeSpecificBounds();
我惊讶地发现您可以设置mesh.bounds,我认为它是只读的。
“设定”界限有什么可能的“含义”?就像:医生办公室里有一份书面尺寸说明简为6'。您将记录更改为5'10“。当然,Jane的身高根本没有变化。您只是,很奇怪地使记录错了。
可能是这样的:因此,网格的边界已被各种(实际上是许多)Unity系统使用。 (剔除等)模式是否可能是程序员通过这样强制边界(对象的边界现在“完全错误”,它们只是您在其中强制执行的某些值)原因)Unity的系统(例如剔除)使用那些强制的,无意义的(对实际对象而言)值?
疯狂的猜测,也许有一种模式(我从未听说过),您在其中“强迫”对象A的边界与对象B相同-由于某种原因,我无法猜测?
这里的模式/原因可能是什么?
我只是假设这是一个基本的错误,但是假设会终止。
答案 0 :(得分:2)
我自己对此真的很好奇,我碰巧有一个程序可以显式生成大量自定义网格,所以我决定测试一些东西。
我要确认的第一件事是界限实际上是自动设置的。初步检查发现确实是这样:特别是,只要您设置了mesh.vertices属性,就会自动重新计算网格的边界。这可能可以解释为什么该属性是固定长度的数组而不是列表。 (有趣的一面:如果您在分配顶点位置之前尝试为网格分配uv坐标或法线等次要属性,请在出现爆炸之前先团结一下,使阵列的长度不匹配。不要这样做。)
对于这实际影响的是什么,我有一个直觉:我将网格边界的范围设置为0。立即,视口角处的网格显示视觉上被剔除。这告诉我们一些事情:
根据Unity手册,在三种情况下使用Bounds类:Mesh.bounds,Renderer.bounds和Collider.bounds。在这三个中,Mesh.bounds是唯一的非只读属性。
关于为什么有人会想要显式设置网格边界的问题,您不可能执行一些巧妙的剔除优化,例如通过窗口或类似方式查看复杂的网格,但是如果我不得不猜测,那么编写该代码的人都不相信Unity能够准确或明确地设置网格边界。