Lightmaps Half-Life 2 BSP


10

ฉันกำลังเขียนโปรแกรมดู BSP สำหรับโครงการมหาวิทยาลัย จนถึงตอนนี้ฉันได้รับการโหลดรูปทรงเรขาคณิตหลักอย่างถูกต้องและ PVS ทำงาน

ตอนนี้ฉันกำลังพยายามใช้ Lightmaps แต่ฉันไม่สามารถรับพิกัดพื้นผิวสำหรับ Lightmaps ที่คำนวณได้อย่างถูกต้อง

ตามที่นี่: 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) ของจุดบนใบหน้าโดย:

คุณ = 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 ด้วยความกว้างและความสูงของพื้นผิวตามลำดับ

ดังนั้นฉันจึงทำการคำนวณดังนี้ นำผลิตภัณฑ์ดอทของจุดยอดและเวกเตอร์ lightmap (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) เพิ่มออฟเซ็ต (lightmapVecs [0] [3]), ลบ mins และหาร ผลลัพธ์ตามความกว้าง / ความสูง

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

อย่างไรก็ตามมันดูเหมือนว่า: lightmaps

ต่อไปนี้เป็นการคำนวณตัวอย่างสำหรับ coord '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

ดูเหมือนว่าจะเป็นเช่นนี้


หากคุณสามารถโพสต์ลิงค์รูปภาพในความคิดเห็นบางคนสามารถแก้ไขได้สำหรับคุณ
The Duck คอมมิวนิสต์

ขอบคุณ ฉันได้รับการโหวตไม่กี่ครั้งดังนั้นฉันจึงสามารถโพสต์ภาพได้ :)
terryhau

ทำไมคุณหารด้วย 14 ขนาดของ lightmap ของคุณเป็น "14" จริงหรือไม่ lightmaps ส่วนใหญ่จะเป็นอำนาจของ 2 ...
PatrickB

คำตอบ:


0

ในที่สุดฉันก็พบว่าฉันกำลังอ่านข้อมูลผิด รหัสทั้งหมดข้างต้นถูกต้อง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.