반감기 2 BSP 라이트 맵


10

대학 프로젝트를위한 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

이 방법은 떨어져 보인다.


댓글에 사진 링크를 게시 할 수 있으면 누군가가 편집 할 수 있습니다.
공산주의 오리

감사. 몇 장의 투표권을 얻었으므로 지금 사진을 게시 할 수 있습니다. :)
terryhau

왜 14로 나눕니 까? 라이트 맵의 크기가 실제로 "14"입니까? 대부분의 라이트 맵은 2의 거듭 제곱입니다.
PatrickB

답변:


0

나는 결국 데이터를 잘못 읽고 있다는 것을 알았습니다. 위의 모든 코드가 정확합니다.


0

내적을 계산하기 전에 벡터를 정규화해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.