私は大学のプロジェクトのBSPビューアを書いています。これまでのところ、メインジオメトリが適切に読み込まれ、PVSが機能しています。
現在、ライトマップを適用しようとしていますが、ライトマップのテクスチャ座標を適切に計算できないようです。
ここによると: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.
}
フロートの最初の配列は、本質的に、ワールドジオメトリにレンダリングされたときにテクスチャがどのように方向付けられ、スケーリングされるかを表す2つのベクトルです。2つのベクトル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はtextureVecs [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);
ただし、次のようになります。
これは、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
これはかなりずれているようです。