Saya sedang menulis penampil BSP untuk proyek universitas. Sejauh ini saya memiliki geometri utama yang dimuat dengan benar, dan PVS berfungsi.
Sekarang saya mencoba menerapkan lightmaps, tetapi sepertinya saya tidak bisa mendapatkan koordinat tekstur untuk lightmaps yang dihitung dengan benar.
Menurut di sini: 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.
}
Array pertama mengapung pada dasarnya adalah dua vektor yang mewakili bagaimana tekstur diorientasikan dan diskalakan ketika diberikan pada geometri dunia. Dua vektor, s dan t, adalah pemetaan arah kiri-ke-kanan dan bawah-ke-atas dalam ruang koordinat piksel tekstur, ke dunia. Setiap vektor memiliki komponen x, y, dan z, ditambah offset yang merupakan "pergeseran" tekstur ke arah itu relatif terhadap dunia. Panjang vektor mewakili penskalaan tekstur di setiap arah.
Koordinat 2D (u, v) piksel tekstur (atau texel) dipetakan ke koordinat dunia (x, y, z) dari suatu titik pada wajah dengan:
u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3
v = tv1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3
(mis. Produk titik vektor dengan titik ditambah offset di arah itu. Dimana tvA, B adalah teksturVecs [A] [B].
Selanjutnya, setelah menghitung (u, v), untuk mengubahnya menjadi koordinat tekstur yang akan Anda kirim ke kartu grafis Anda, bagilah u dan v masing-masing dengan lebar dan tinggi tekstur.
Jadi saya melakukan perhitungan sebagai berikut. Ambil titik produk dari titik dan vektor lightmap (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) tambahkan offset (lightmapVecs [0] [3]), kurangi menit, dan bagi hasil dengan lebar / tinggi.
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);
Namun akhirnya terlihat seperti ini:
Berikut ini perhitungan sampel untuk coord tekstur 't' untuk satu titik.
vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14
Jadi produk titik adalah -1408
(-1408 + 0 - 9) / 14
t = -101.21
Ini sepertinya jauh.
sumber
Jawaban:
Saya akhirnya menemukan, saya salah membaca data. Semua kode di atas sudah benar.
sumber
Anda harus menormalkan vektor sebelum menghitung produk titik.
sumber