Напівжиття 2 BSP Lightmaps


10

Я пишу глядача BSP для університетського проекту. Поки головна геометрія завантажена належним чином, а ПВС працює.

Зараз я намагаюся застосувати світлові карти, але я не можу отримати координати текстури для світлих карт, розраховані належним чином.

Відповідно до тут: 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 - текстураVecs [A] [B].

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

Тому я роблю розрахунок наступним чином. Візьміть точковий добуток вершини та вектора світлової карти (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]), додайте зміщення (lightmapVecs [0] [3]), відніміть хвилини та розділіть результат за шириною / висотою.

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);

Однак це виглядає так: світлові карти

Ось зразок розрахунку координати текстури '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

Це здається геть.


Якщо ви можете опублікувати посилання на зображення у коментарях, хтось може відредагувати його замість вас.
Качка комуністична

Дякую. У мене було декілька голосів, щоб я тепер міг розмістити фотографії. :)
terryhau

Чому ви ділитесь на 14? Чи справді розмір вашої світлової карти "14"? Більшість світлових карт - це повноваження 2 ...
PatrickB

Відповіді:


0

Зрештою я зрозумів, я читав дані неправильно. Весь код вказаний вище.


0

Ви повинні нормалізувати вектори перед розрахунком крапкового добутку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.