Unity и VR для сложных строительных CAD-моделей - PullRequest
0 голосов
/ 25 января 2019

Я работаю в строительстве, и мы пытаемся визуализировать наши проекты, используя Unity и Oculus Rift.

Практически все наши модели созданы с использованием Revit, и мы экспортируем их в fbx и переносим в Unity. Для каждой имеющейся у нас модели (электрической, механической, архитектурной, фасадной ...) мы генерируем fbx в Revit и приводим в Unity.

Модели содержат от 3000 до 60000 объектов (сеток) и от 3 до 40 миллионов полигонов. Когда мы пытаемся визуализировать модели в Unity, мы получаем очень низкий FPS, около 2–3 кадров в секунду, и вызовы пакетной отрисовки около 15000–20000.

Я считаю, что проблема заключается в сложности всех наших моделей, которые мы объединяем в Unity. Интересно, есть ли способ оптимизировать его, я уже пробовал децимацию, отключение теней, окклюзию, но, похоже, ничего не работает. Объединение моделей в один объект не вариант, потому что мы должны позволить пользователю выбирать и проверять отдельные элементы.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вы также можете найти интересный набор инструментов Forge Unity AR / VR:

Как вы, наверное, знаете, Forge высоко оптимизирован для профессиональной визуализации больших CAD-моделей.

0 голосов
/ 25 января 2019

Я работаю над чем-то похожим, и я могу поделиться некоторым опытом для подобных задач со многими вершинами или сетками.Я пытаюсь визуализировать облака точек в Unity, и это очень сложная задача.В моем случае я сам создаю облака точек и не триангулирую их.Это помогает, но мне все еще приходится применять оптимизации.

По моему опыту, если у вас есть вершины более 10 миллионов визуализированных в кадре, у вас начнутся проблемы с fps.Это может варьироваться в зависимости от вашего оборудования, конечно.Также я уверен, что это будет еще хуже с триангулированными сетками.Для оптимизации я сделал следующее:

  1. Сначала я начал рендеринг объектов, которые находятся в Camera Frustum Для этого я использовал функцию под названием IsVisibleFrom который является расширением до Renderer следующим образом:

    с использованием UnityEngine;

    public static class RendererExtensions
    {
          public static bool IsVisibleFrom(this Renderer renderer, Camera camera)
          {
                Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
                return GeometryUtility.TestPlanesAABB(planes, renderer.bounds);
          }
    }
    

Тогда вы можете использовать его следующим образомперебрав все имеющиеся у вас меши:

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());
}
Второй вариант будет, если это возможно, и если вы сможете создавать сетки с более низкой детализацией, используя Уровень детализации .По сути, он рендерит меши с низкой детализацией, которые находятся дальше от камеры. Последний вариант, который я могу порекомендовать, - это использование Occlusion Culling .Это похоже на первый вариант, но он также учитывает окклюзии, что было не так для меня, потому что у меня были только очки.
...