在Unity3D中,“设置”网格边界的作用是什么?

时间:2019-03-29 13:53:27

标签: unity3d mesh aabb

在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();
  1. 我惊讶地发现您可以设置mesh.bounds,我认为它是只读的。

  2. “设定”界限有什么可能的“含义”?就像:医生办公室里有一份书面尺寸说明简为6'。您将记录更改为5'10“。当然,Jane的身高根本没有变化。您只是,很奇怪地使记录错了。

  3. 可能是这样的:因此,网格的边界已被各种(实际上是许多)Unity系统使用。 (剔除等)模式是否可能是程序员通过这样强制边界(对象的边界现在“完全错误”,它们只是您在其中强制执行的某些值)原因)Unity的系统(例如剔除)使用那些强制的,无意义的(对实际对象而言)值?

  4. 疯狂的猜测,也许有一种模式(我从未听说过),您在其中“强迫”对象A的边界与对象B相同-由于某种原因,我无法猜测?

这里的模式/原因可能是什么?

我只是假设这是一个基本的错误,但是假设会终止。

1 个答案:

答案 0 :(得分:2)

我自己对此真的很好奇,我碰巧有一个程序可以显式生成大量自定义网格,所以我决定测试一些东西。

我要确认的第一件事是界限实际上是自动设置的。初步检查发现确实是这样:特别是,只要您设置了mesh.vertices属性,就会自动重新计算网格的边界。这可能可以解释为什么该属性是固定长度的数组而不是列表。 (有趣的一面:如果您在分配顶点位置之前尝试为网格分配uv坐标或法线等次要属性,请在出现爆炸之前先团结一下,使阵列的长度不匹配。不要这样做。)

对于这实际影响的是什么,我有一个直觉:我将网格边界的范围设置为0。立即,视口角处的网格显示视觉上被剔除。这告诉我们一些事情:

  1. 明确设置边界确实有效。
  2. Unity实际上使用自定义范围数据。
  3. Unity使用网格边界执行平截头体剔除。

根据Unity手册,在三种情况下使用Bounds类:Mesh.bounds,Renderer.bounds和Collider.bounds。在这三个中,Mesh.bounds是唯一的非只读属性。

关于为什么有人会想要显式设置网格边界的问题,您不可能执行一些巧妙的剔除优化,例如通过窗口或类似方式查看复杂的网格,但是如果我不得不猜测,那么编写该代码的人都不相信Unity能够准确或明确地设置网格边界。