我从事建筑工作,我们正在尝试使用Unity和Oculus Rift可视化我们的项目。
基本上,我们所有的模型都是使用Revit创建的,然后将它们导出到fbx并将其带入Unity。对于我们拥有的每个模型(电气,机械,建筑,立面...),我们都会在Revit中生成一个fbx,并将其引入Unity。
模型具有约3000至60000个对象(网格)和约300万至4000万个多边形。当我们尝试在Unity中可视化模型时,我们得到的FPS非常低,约为2到3 fps,并且批绘制调用约为15000到20000。
我相信问题在于我们整合到Unity中的所有模型的复杂性。我想知道是否有任何方法可以对其进行优化,我已经尝试过抽取,禁用阴影,遮挡,但是似乎没有任何效果。将模型折叠成单个对象不是一种选择,因为我们必须允许用户选择和检查单个元素。
答案 0 :(得分:1)
我正在从事类似的工作,我可以与许多顶点或网格共享此类任务的一些经验。我试图在Unity中可视化点云,这是一项非常具有挑战性的任务。就我而言,尽管我自己创建点云,但不对它们进行三角剖分。它有帮助,但我仍然必须应用优化。
根据我的经验,如果在一帧中渲染的顶点超过1000万,则开始出现fps问题。当然,这取决于您的硬件。我也相信,使用三角网格,这会变得更糟。我为优化事物所做的工作如下:
我首先从渲染Camera Frustum中的对象开始,为此,我使用了一个名为Renderer
的函数,该函数类似于extension到public static class RendererExtensions
{
public static bool IsVisibleFrom(this Renderer renderer, Camera camera)
{
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
return GeometryUtility.TestPlanesAABB(planes, renderer.bounds);
}
}
这个:
使用UnityEngine;
Renderer grid;
IEnumerator RenderVisibleGameObject()
{
for (int i = 0; i < PointCloud.transform.childCount; i++)
{
grid = PointCloud.transform.GetChild(i).GetComponent<Renderer>();
if (!grid.IsVisibleFrom(cam))
{
grid.gameObject.SetActive(false);
}
else
{
grid.gameObject.SetActive(true);
}
if (i == (PointCloud.transform.childCount - 1))
yield return null;
}
StartCoroutine(RenderVisibleGameObject());
}
然后,您可以遍历您拥有的所有网格来像这样使用它:
{{1}}
答案 1 :(得分:1)
您可能还会发现感兴趣的Forge Unity AR / VR工具包:
您可能已经知道,Forge已针对大型CAD模型的专业可视化进行了高度优化。