Half-Life 2 BSP Lightmaps

Я пишу программу просмотра BSP для университетского проекта. До сих пор я правильно загружал основную геометрию, и PVS работал.

Теперь я пытаюсь применить lightmaps, но я не могу получить координаты текстуры для правильно подсчитанных карт света.

В соответствии с этим: http://developer.valvesoftware.com/wiki/The_Source_Engine_BSP_File_Format

struct texinfo_t
{
    float textureVecs[2][4];  // [s/t][xyz offset]
    float lightmapVecs[2][4]; // [s/t][xyz offset] - length is in units of texels/area
    int flags;                // miptex flags overrides
    int texdata;               // Pointer to texture name, size, etc.
}
  

Первый массив поплавков находится в   сущность двух векторов, которые представляют, как   текстура ориентирована и масштабируется   при визуализации на мировой геометрии.   Два вектора s и t являются   отображение слева направо и   направления вниз по текстуре   пиксельного координатного пространства на   Мир. Каждый вектор имеет x, y и z   компонент, плюс смещение, которое является   «сдвиг» текстуры в этом   по отношению к миру.   длина векторов представляет собой   масштабирование текстуры в каждом   направление.

     

2D-координаты (u, v) текстуры   пиксель (или тексель) отображаются на   мировые координаты (x, y, z) точки   на лице:

     

u = tv0,0 * x + tv0,1 * y + tv0,2 * z   + tv0,3

     

v = tv1,0 * x + tv1,1 * y + tv1,2 * z   + tv1,3

     

(т. е. точечное произведение векторов   с вершиной плюс смещение в   это направление. Где tvA, B -   textureVecs [А] [В].

     

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

Итак, я делаю расчет следующим образом. Возьмите произведение точек вершины и вектора lightmap (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) добавьте смещение (lightmapVecs [0] [3]), вычтите mins и разделите результат на ширину /высоту.

float s = Vector3f.dot(v, new Vector3f(lightmapVecs[0][0], lightmapVecs[0][1], lightmapVecs[0][2])) + lightmapVecs[0][3] - f.LightmapTextureMinsInLuxels[0];
float t = Vector3f.dot(v, new Vector3f(lightmapVecs[1][0], lightmapVecs[1][1], lightmapVecs[1][2])) + lightmapVecs[1][3] - f.LightmapTextureMinsInLuxels[1];
s /= (f.LightmapTextureSizeInLuxels[0] + 1);
t /= (f.LightmapTextureSizeInLuxels[1] + 1);

Однако это выглядит следующим образом: lightmaps

Вот пример расчета текстуры для координаты 't' для одной вершины.

vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14

Итак, точечный продукт равен -1408

(-1408 + 0 - 9) / 14

t = -101.21

Это кажется пустым.

10 голосов | спросил terryhau 31 MarpmThu, 31 Mar 2011 16:13:44 +04002011-03-31T16:13:44+04:0004 2011, 16:13:44

2 ответа


0

В конце концов я понял, что я читал данные не так. Все приведенные выше коды верны.

ответил terryhau 3 J0000006Europe/Moscow 2011, 17:11:32
0

Вы должны нормализовать векторы перед вычислением точечного продукта.

ответил Fabian 2 AMpSat, 02 Apr 2011 00:41:03 +040041Saturday 2011, 00:41:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132