Это вектор нормалей n треугольника:
Видимость треугольника основана на его нормальном , Математика, которая вычисляет свет, который попадает в треугольник, отражается и попадает в ваши глаза (камера 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()
, так что вы, вероятно, можете использовать вычисления, которые уже там выполняются, для проверки сигнала с [почти] нулевой потерей производительности.