Half-Life 2 BSP Lightmap


10

Sto scrivendo un visualizzatore BSP per un progetto universitario. Finora ho caricato correttamente la geometria principale e il PVS funzionava.

Ora sto cercando di applicare le mappe luminose, ma non riesco a ottenere le coordinate della trama per le mappe luminose calcolate correttamente.

Secondo qui: 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.
}

La prima serie di float è essenzialmente due vettori che rappresentano come la trama è orientata e ridimensionata quando viene renderizzata sulla geometria del mondo. I due vettori, s e t, sono la mappatura delle direzioni da sinistra a destra e dall'alto verso il basso nello spazio delle coordinate dei pixel della trama, sul mondo. Ogni vettore ha un componente x, ye z, più un offset che è lo "spostamento" della trama in quella direzione rispetto al mondo. La lunghezza dei vettori rappresenta il ridimensionamento della trama in ciascuna direzione.

Le coordinate 2D (u, v) di un pixel di trama (o texel) sono mappate alle coordinate del mondo (x, y, z) di un punto su una faccia mediante:

u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3

v = tv1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3

(ad es. Il punto prodotto dei vettori con il vertice più l'offset in quella direzione. Dove tvA, B è textureVecs [A] [B].

Inoltre, dopo aver calcolato (u, v), per convertirli in coordinate di trama che invieresti alla tua scheda grafica, dividi rispettivamente u e v per la larghezza e l'altezza della trama.

Quindi sto facendo il calcolo come segue. Prendi il prodotto punto del vertice e il vettore lightmap (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) aggiungi l'offset (lightmapVecs [0] [3]), sottrai i minuti e dividi il risultato per larghezza / altezza.

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

Tuttavia finisce per apparire così: lightmaps

Ecco un calcolo di esempio per la trama 't' per un vertice.

vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14

Quindi il prodotto punto è -1408

(-1408 + 0 - 9) / 14

t = -101.21

Sembra lontano.


Se puoi inserire un link immagine nei commenti, qualcuno può modificarlo per te.
Il comunista Duck il

Grazie. Ho ottenuto qualche voto in modo da poter pubblicare le foto ora. :)
terryhau

Perché dividi per 14? Le dimensioni della tua lightmap sono davvero "14"? La maggior parte delle mappe luminose sono poteri di 2 ...
PatrickB

Risposte:


0

Alla fine ho capito, stavo leggendo i dati in modo sbagliato. Tutto il codice sopra è corretto.


0

È necessario normalizzare i vettori prima di calcolare il prodotto punto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.