формат файла Quake 2 MD2 (теория) - PullRequest
6 голосов
/ 19 ноября 2009

Я пытаюсь загрузить MD2 файлы в OpenGL, но я заметил, что большинство примеров программ просто используют

предварительно скомпилированный список нормалей. как то так .....

//table of precalculated normals  
{ -0.525731f,  0.000000f,  0.850651f },   
{ -0.442863f,  0.238856f,  0.864188f },   
{ -0.295242f,  0.000000f,  0.955423f },   
{ -0.309017f,  0.500000f,  0.809017f },   
...  
... 

Хорошо, это может звучать довольно глупо, но я думал, что каждая модель состоит из разных треугольников, как же тогда возможно использовать один набор предварительно скомпилированных нормалей для рендеринга всех моделей? Это кажется странным, и любые идеи будут оценены.

Ответы [ 3 ]

9 голосов
/ 19 ноября 2009

Вы можете использовать предварительно скомпилированную таблицу нормалей и использовать таблицу поиска, чтобы выбрать таблицу, которая «достаточно хороша» для конкретного случая. Каждый треугольник находится на отдельной плоскости, и эта плоскость имеет нормаль, а не сам треугольник.

Например, давайте представим, что у нас есть точка зрения. Раскройте эту точку в сфере для целей этого обсуждения, это немного легче понять концептуально. Если вы нарисуете идеальный круг вокруг этой сферы по оси y, а затем поверните этот круг по оси x на 1 градус каждый раз, в результате вы получите 360 кругов. Если вы возьмете нормаль с интервалами в 1 градус вдоль каждого из этих кругов, вы получите 360 ** 2 баллов. Оттуда ваша нормаль является вектором от центра сферы к этой точке на сфере, и это нормаль для плоскости, построенной по касательной к точке на сфере. В итоге, если вы вычислите эти два значения для каждой точки в этой сфере, вы получите предварительно рассчитанную таблицу нормалей, которая почти наверняка окажется достаточно хорошей для большинства ситуаций. Теперь вам просто нужно разработать схему поиска для этих данных (плоскость -> нормальная).

6 голосов
/ 19 ноября 2009

Ответ уже получен, но я хочу пролить немного света на него.

Таблица содержит векторы, которые равномерно покрывают поверхность предметной сферы. Кажется, набор из 162 векторов является углами подразделенного икосаэдра . Это сделано, чтобы сжимать с потерями трехмерные векторы единичной длины в индекс (8 бит), см. векторное квантование . Для хранения произвольного вектора нормалей вы можете найти в таблице наиболее близкое совпадение и вместо этого сохранить индекс этого совпадения. С этой таблицей из 162 хорошо распределенных векторов ожидается, что угол между исходным вектором и приближенным вектором будет ниже 11 °, что, по-видимому, достаточно для двигателя Quake2.

2 голосов
/ 19 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...