Bir üniversite projesi için BSP görüntüleyici yazıyorum. Şimdiye kadar ana geometri düzgün bir şekilde yüklendi ve PVS çalışıyor.
Şimdi ışık haritalarını uygulamaya çalışıyorum ama düzgün şekilde hesaplanan ışık haritalarının doku koordinatlarını göremiyorum.
Buraya göre: 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.
}
İlk şamandıra dizisi özünde, dünya geometrisinde oluşturulduğunda dokunun nasıl yönlendirildiğini ve ölçeklendiğini temsil eden iki vektördür. İki vektör, s ve t, doku pikseli koordinat alanındaki soldan sağa ve aşağıdan yukarıya yönlerin dünyaya eşlenmesidir. Her vektör bir x, y ve z bileşenine ve ayrıca dokunun dünyaya göre o yönde "kayması" olan bir kaymaya sahiptir. Vektörlerin uzunluğu, dokunun her yönde ölçeklenmesini temsil eder.
Doku pikselinin (veya texelinin) 2B koordinatları (u, v), bir yüzdeki bir noktanın dünya koordinatlarına (x, y, z) şu şekilde eşlenir:
u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3
v = tv1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3
(yani. Tepe noktası artı vektörleri bu yönde ofset ile vektörlerin nokta çarpımı. Burada TVA, B dokuVecs [A] [B] 'dir.
Ayrıca, (u, v) hesapladıktan sonra, bunları grafik kartınıza göndereceğiniz doku koordinatlarına dönüştürmek için, sırasıyla u ve v'yi dokunun genişliğine ve yüksekliğine bölün.
Hesaplamayı şu şekilde yapıyorum. Köşenin nokta ürününü ve ışık haritası vektörünü alın (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) ofseti ekleyin (lightmapVecs [0] [3]), dakikaları çıkarın ve bölün genişlik / yükseklik ile sonuçlanır.
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);
Ancak bunun gibi görünüyor:
İşte bir tepe için doku koordinat 't' için örnek bir hesaplama.
vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14
Yani nokta ürün -1408
(-1408 + 0 - 9) / 14
t = -101.21
Bu çok uzak görünüyor.