Tôi đang viết một trình xem BSP cho một dự án đại học. Cho đến nay tôi đã tải hình học chính và PVS hoạt động.
Bây giờ tôi đang cố gắng áp dụng các lightmap, nhưng dường như tôi không thể có được tọa độ kết cấu cho các lightmap được tính toán chính xác.
Theo tại đây: 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.
}
Mảng đầu tiên của phao là về cơ bản hai vectơ đại diện cho cách kết cấu được định hướng và thu nhỏ khi được hiển thị trên hình học thế giới. Hai vectơ, s và t, là ánh xạ của các hướng từ trái sang phải và từ trên xuống trong không gian tọa độ pixel kết cấu, trên thế giới. Mỗi vectơ có thành phần x, y và z, cộng với phần bù là "sự dịch chuyển" của kết cấu theo hướng đó so với thế giới. Độ dài của các vectơ biểu thị tỷ lệ của kết cấu theo từng hướng.
Các tọa độ 2D (u, v) của pixel kết cấu (hoặc texel) được ánh xạ tới tọa độ thế giới (x, y, z) của một điểm trên một mặt bằng:
u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3
v = tv1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3
(tức là tích của các vectơ có đỉnh cộng với phần bù theo hướng đó. Trong đó tvA, B là textureVecs [A] [B].
Hơn nữa, sau khi tính toán (u, v), để chuyển đổi chúng thành tọa độ kết cấu mà bạn sẽ gửi cho card đồ họa của mình, chia u và v cho chiều rộng và chiều cao của kết cấu tương ứng.
Vì vậy, tôi đang làm tính toán như sau. Lấy sản phẩm chấm của đỉnh và vectơ ánh sáng (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) thêm phần bù (lightmapVecs [0] [3]), trừ các phút và chia kết quả theo chiều rộng / chiều cao.
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);
Tuy nhiên, nó trông giống như thế này:
Đây là một tính toán mẫu cho tọa độ kết cấu 't' cho một đỉnh.
vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14
Vậy sản phẩm chấm là -1408
(-1408 + 0 - 9) / 14
t = -101.21
Điều này dường như tắt.