대학 프로젝트를위한 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.
}
플로트의 첫 번째 배열은 본질적으로 월드 지오메트리에서 렌더링 될 때 텍스처의 방향과 크기를 나타내는 두 개의 벡터입니다. 두 벡터 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);
그러나 다음과 같이 보입니다.
다음은 하나의 정점에 대한 텍스처 좌표 '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
이 방법은 떨어져 보인다.