Создание пользовательской выпуклой оболочки и сетки в Unity

В настоящее время я пытаюсь реализовать сложное поле поиска в проекте Unity, над которым я работаю, где пользователь имеет возможность создавать точки в сцене. Моя цель - создать настраиваемую форму для этого пользователя на основе созданных им точек, а затем я хотел бы определить, находятся ли другие объекты внутри этой формы, аналогично обнаружению точки внутри сложного корпуса (все еще шаткого на основе теории, но пример можно найти здесь). Если возможно, я бы также хотел, чтобы форма обновлялась, если точки позже перемещаются, придавая ей ощущение почти эластичности и эластичности.

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

На данный момент самое близкое визуальное представление, которое я мог придумать, - это список, отслеживающий точки пользователя, и скрипт, который просто рисует кучу псевдотреугольников, используя LineRenderers для соединения каждой точки, даже если она не является внешней. лиц, повторяя список несколько раз. Хотя это выглядит близко к тому, что я хочу, на самом деле это никоим образом не полезно, поскольку я не знаю, как `` заполнить '' эти лица, и я все еще относительно заблудился, когда дело доходит до того, является ли объект внутри этого корпуса, как красная сфера, показанная в примере ниже.

Угол 1

Угол 2

Я также могу многократно разрушать и перерисовывать эти строки во время метода Update (), что позволяет мне захватывать точку и перемещать ее, что приводит к динамическому изменению формы, но это приводит к нежелательному эффекту мигания, которого я бы скорее избегал Теперь.

Поскольку это такой широкий вопрос, я также включил метод, который я использую для рисования этих линий ниже, который соединяет связку линий в форме треугольников с пустым игровым объектом для легкого разрушения и воссоздания:

void drawHull()
{
    if (!GameObject.Find("hullHold"))
    {
        hullHold = new GameObject();
        hullHold.name = "hullHold";
    }

    foreach(GameObject point in points)
    {
        for (int i = points.IndexOf(point); i < points.Count - 2; i++)
        {
            lineEdge = Instantiate(lineReference);
            lineEdge.name = "Triangle" + i;
            lineEdge.GetComponent<LineRenderer>().startColor = Color.black;
            lineEdge.GetComponent<LineRenderer>().endColor = Color.black;
            lineEdge.GetComponent<LineRenderer>().positionCount = 3;
            lineEdge.GetComponent<LineRenderer>().SetPosition(0, points[points.IndexOf(point)].transform.position);
            lineEdge.GetComponent<LineRenderer>().SetPosition(1, points[i + 1].transform.position);
            lineEdge.GetComponent<LineRenderer>().SetPosition(2, points[i + 2].transform.position);
            lineEdge.GetComponent<LineRenderer>().loop = true;
            lineEdge.SetActive(true);
            lineEdge.transform.SetParent(hullHold.transform);
        }
    }
}

Если кто-то сталкивался с подобной проблемой в другом месте, которую я просто не мог найти, дайте мне знать! Все, что угодно, от дополнительных знаний о создании пользовательской сетки до более подробного и удобного для новичков объяснения определения того, находится ли точка внутри выпуклой оболочки, было бы весьма полезно. Если это вообще актуально, я работаю в виртуальной реальности и использую версию 2018.2.6f1, чтобы гарантировать, что пакет Oculus rift и Unity работают нормально, но у меня не было никаких проблем с работой в среде, отставшей на несколько месяцев.

Спасибо!


person Jaded_Kronos    schedule 01.04.2019    source источник
comment
Что ж, это довольно широкий вопрос, но насколько я понимаю, ваша проблема заключается в обнаружении ближайших точек для треугольников, потому что пользователь не обязательно нажимает на соседние позиции. Для этого вы можете взглянуть на это   -  person Ali Kanat    schedule 01.04.2019


Ответы (1)


Вы упомянули присвоение вершин и трисов сетке - это «правильный» способ сделать это в единстве, поскольку он связан с высоко оптимизированным MeshRenderer, а также я считаю, что коллайдеры могут использовать сетки там, где заданы такие формы, так что вы должны иметь возможность просто подключиться к PhysX и запросить у него коллайдеры, перекрывающиеся с вашей сеткой. Делать это вручную, иначе говоря, перебирать лица и устанавливать фактические границы вашего объекта, на самом деле довольно сложно эффективно.

person zambari    schedule 02.04.2019