Я пишу глядача 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
Це здається геть.