Кажется, что Вы перенапрягаете regex с этой целью. То, что я сделал бы, использовать regex, чтобы соответствовать нескольким форматам даты и затем использовать отдельную функцию для проверки значений полей даты, так извлеченных.
You could use a precompiled table of normals, and use a lookup table to select one that is 'good enough' for a particular case. Each triangle is on a distinct plane, and it's that plane that has a normal, not the triangle itself.
For instance, lets imagine we have a point. Expand that point into a sphere for the purposes of this discussion, makes it a little easier to grasp conceptually. If you draw a perfect circle around that sphere on the y
axis, then rotate that circle in the x
axis 1 degree each time, you'll end up with 360 circles. If you take a normal at 1 degree intervals along each of those circles, you'll end up with 360 ** 2
points. From there, your normal is the vector from the center of the sphere to that point on the sphere, and it is a normal for a plane constructed tangential to point on the sphere. What you end up with if you calculate these two for every point on that sphere is a precalculated table of normals, which will almost certainly be good enough for most situations. Now you just need to design a lookup scheme for that data (plane -> normal).
Формат файла MD2 определяет, что каждая вершина имеет «нормальный индекс», и это поиск в хорошо известной таблице нормалей . Я бы предположил, что эти нормали распределены по сфере. Предположительно, инструмент, который построил модель, выбрал наиболее подходящие из этих нормалей для каждой вершины.
Что касается первого ответа: если вам нужна очень фасетная модель (например, куб), тогда каждый полигон действительно имеет свой собственный нормальный, и каждая из вершин, составляющих этот многоугольник, должна использовать один и тот же вектор нормали. Однако, если вам нужно плавное затенение (например, торса), обычно каждая вершина в многоугольнике имеет свой вектор нормали. Это позволяет изменять освещение по многоугольнику, что полезно как в сценариях освещения по вершинам, так и по пикселям.
Ответ уже был дан, но я хочу пролить на него больше света.
Таблица содержит векторы, которые довольно равномерно покрывают поверхность единичной сферы. Похоже, что набор из 162 векторов является углами разделенного икосаэдра . Это делается для сжатия трехмерных векторов единичной длины с потерями до индекса (8 бит), см. векторное квантование . Для хранения произвольного вектора нормали вы можете искать в таблице ближайшее совпадение и вместо этого сохранять индекс этого совпадения. В этой таблице из 162 хорошо распределенных векторов угол между исходным и приближенным векторами, как ожидается, будет ниже 11 °, что кажется достаточно хорошим для движка Quake2.