Создание собственной выпуклой оболочки и сетки в Unity - PullRequest
0 голосов
/ 01 апреля 2019

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

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

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

Angle 1

Angle 2

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

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

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);
        }
    }
}

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

Спасибо!

1 Ответ

0 голосов
/ 02 апреля 2019

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

...