Unity Me sh Рендерер генерирует полигоны на неправильной стороне - PullRequest
1 голос
/ 22 февраля 2020

Итак, мне нужно сгенерировать многоугольник, используя компонент Unity Me sh, который имеет n вершин. Я использую пользовательскую функцию Triangulate (), которая может найти индексы для me sh .triangles.

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

Теперь я знаю, что это связано с порядком намотки Unity по часовой стрелке, но как я могу убедиться, что многоугольник всегда генерируется на правильной стороне, независимо от того, вершины ли я его кормить? Или может быть способ узнать, на какой стороне сгенерирован me sh, чтобы я мог соответствующим образом настроить камеру?

Используемая мной функция триангулятора

1 Ответ

0 голосов
/ 24 февраля 2020

Это вектор нормалей n треугольника:

enter image description here

Видимость треугольника основана на его нормальном , Математика, которая вычисляет свет, который попадает в треугольник, отражается и попадает в ваши глаза (камера Unity) использует для этого нормаль треугольника. По сути, если этот вектор n указывает на ваши глаза, это означает, что вы можете видеть [часть] света, который падает на эту поверхность.

Чтобы узнать, видите ли вы треугольник, вам нужно знать, если нормальный указывает на вас. Не вдаваясь в математику, нормаль задается путем вычисления перекрестного произведения векторов, определенных вершинами треугольника.

Например, треугольник AB- C может быть определен векторами AB и B C (не связано с рисунком выше). Или вы можете инвертировать «направление» этого треугольника и определить его A C и CB. Нормаль AB / B C имеет одно направление, а нормаль AC / CB - противоположное, из-за ... математики - если вы гуглите этот материал, вы можете узнать, почему, есть тонны учебников.

Итак, я написал все это, чтобы сказать то, что вы уже знаете: порядок вершин определяет видимость. Но это потому, что оно определяет направление нормали. Теперь взгляните на этот код:

        var a = new Vector3(0f, 0f, 0f);
        var b = new Vector3(0.5f, 0.5f, 0f);
        var c = new Vector3(0f, 1f, 0f);

        var ab = b - a;
        var bc = c - b;
        Debug.Log(Vector3.Cross(ab, bc)); // this prints (0.0, 0.0, 0.5)

        var ac = c - a;
        var cb = b - c;
        Debug.Log(Vector3.Cross(ac, cb)); // this prints (0.0, 0.0, -0.5)

Обратите внимание, что во втором случае z отрицательно, поэтому оно направлено на вас (ваша камера, вероятно, установлена ​​на (0, 0, -10) или что-то подобное). Поэтому, если вы определите треугольник таким образом, вы сможете его увидеть.

Короче говоря: чтобы узнать, видите ли вы треугольник, проверьте сигнал z-компонента перекрестного произведения вершин. Если результат не тот сигнал, который вам нужен, поменяйте местами вершины.

Я не прочитал код из вашей функции триангулятора, но я увидел, что он использует 2D. Это означает, что это может быть упрощено в дальнейшем. Похоже, что он также вычисляет перекрестное произведение в InsideTriangle(), так что вы, вероятно, можете использовать вычисления, которые уже там выполняются, для проверки сигнала с [почти] нулевой потерей производительности.

...