Unity和VR用于复杂的建筑CAD模型

时间:2019-01-25 12:30:28

标签: unity3d oculus cad revit

我从事建筑工作,我们正在尝试使用Unity和Oculus Rift可视化我们的项目。

基本上,我们所有的模型都是使用Revit创建的,然后将它们导出到fbx并将其带入Unity。对于我们拥有的每个模型(电气,机械,建筑,立面...),我们都会在Revit中生成一个fbx,并将其引入Unity。

模型具有约3000至60000个对象(网格)和约300万至4000万个多边形。当我们尝试在Unity中可视化模型时,我们得到的FPS非常低,约为2到3 fps,并且批绘制调用约为15000到20000。

我相信问题在于我们整合到Unity中的所有模型的复杂性。我想知道是否有任何方法可以对其进行优化,我已经尝试过抽取,禁用阴影,遮挡,但是似乎没有任何效果。将模型折叠成单个对象不是一种选择,因为我们必须允许用户选择和检查单个元素。

2 个答案:

答案 0 :(得分:1)

我正在从事类似的工作,我可以与许多顶点或网格共享此类任务的一些经验。我试图在Unity中可视化点云,这是一项非常具有挑战性的任务。就我而言,尽管我自己创建点云,但不对它们进行三角剖分。它有帮助,但我仍然必须应用优化。

根据我的经验,如果在一帧中渲染的顶点超过1000万,则开始出现fps问题。当然,这取决于您的硬件。我也相信,使用三角网格,这会变得更糟。我为优化事物所做的工作如下:

  1. 我首先从渲染Camera Frustum中的对象开始,为此,我使用了一个名为Renderer的函数,该函数类似于extensionpublic 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. 如果可能,并且您可以使用Level of Detail创建较低细节的网格,则可以使用第二个选项。基本上,它的作用是渲染距离相机更远的低细节网格。
  2. 我可以推荐的最后一个选择是使用Occlusion Culling。这类似于第一个选项,但是它也可以处理遮挡,对我而言不是这样,因为我只有一点。

答案 1 :(得分:1)

您可能还会发现感兴趣的Forge Unity AR / VR工具包:

您可能已经知道,Forge已针对大型CAD模型的专业可视化进行了高度优化。