Half-Life 2 BSP Işık Haritaları


10

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: lightmaps

İş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.


Yorumlarda resim bağlantısı gönderebilirseniz, birisi sizin için düzenleyebilir.
Komünist Ördek

Teşekkürler. Resim gönderebilmem için birkaç oylama aldım. :)
terryhau

Neden 14'e bölüyorsun? Işık haritanızın boyutu gerçekten "14" mü? Çoğu ışık haritası 2'nin gücüdür ...
PatrickB

Yanıtlar:


0

Sonunda anladım, verileri yanlış okuyordum. Yukarıdaki tüm kodlar doğrudur.


0

Nokta ürününü hesaplamadan önce vektörleri normalleştirmelisiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.