हाफ-लाइफ 2 बीएसपी लाइटमैप


10

मैं एक विश्वविद्यालय परियोजना के लिए बीएसपी दर्शक लिख रहा हूं। अब तक मेरे पास मुख्य ज्यामिति ठीक से लोड है, और पीवीएस काम कर रहा है।

अब मैं lightmaps लागू करने की कोशिश कर रहा हूँ, लेकिन मैं ठीक से गणना lightmaps के लिए बनावट निर्देशांक प्राप्त करने के लिए प्रतीत नहीं कर सकते।

यहाँ के अनुसार: http://developer.valvesoftware.com/wiki/The_Source_Engine_BSP_FileFFatat

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.
}

फ़्लोट्स की पहली सरणी सार दो वैक्टर में है जो यह दर्शाती है कि विश्व ज्यामिति पर प्रस्तुत किए जाने पर बनावट कैसे उन्मुख और स्केल की जाती है। दो वैक्टर, एस और टी, लेफ्ट-टू-राइट और डाउन-टू-अप दिशाओं की मैपिंग हैं जो दुनिया में बनावट पिक्सेल समन्वय अंतरिक्ष में हैं। प्रत्येक वेक्टर में एक x, y और z घटक होता है, साथ ही एक ऑफसेट जो दुनिया के सापेक्ष उस दिशा में बनावट का "बदलाव" है। वैक्टर की लंबाई प्रत्येक दिशा में बनावट की स्केलिंग का प्रतिनिधित्व करती है।

एक बनावट पिक्सेल (या टेक्सल) के 2 डी निर्देशांक (यू, वी) को दुनिया के निर्देशांक (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 बनावट है वीकेएस [ए] [बी]।

इसके अलावा, गणना (यू, वी) के बाद, उन्हें बनावट निर्देशांक में बदलने के लिए जो आप अपने ग्राफिक्स कार्ड को भेजेंगे, क्रमशः यू और वी को बनावट की चौड़ाई और ऊंचाई से विभाजित करें।

इसलिए मैं गणना इस प्रकार कर रहा हूं। शीर्ष और डॉटमैप वेक्टर उत्पाद (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);

हालाँकि यह इस तरह दिखता है: lightmaps

यहाँ एक शीर्ष के लिए बनावट समन्वय '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

यह रास्ता बंद लगता है।


यदि आप टिप्पणियों में एक तस्वीर लिंक पोस्ट कर सकते हैं, तो कोई इसे आपके लिए संपादित कर सकता है।
कम्युनिस्ट डक

धन्यवाद। मुझे कुछ वोट मिले इसलिए मैं अब तस्वीरें पोस्ट कर सकता हूं। :)
टेरीहाऊ

आप 14 से क्यों विभाजित कर रहे हैं? क्या आपके लाइटमैप का आकार वास्तव में "14" है? अधिकांश
लाइटमैप

जवाबों:


0

मुझे अंततः पता चला, मैं गलत तरीके से डेटा पढ़ रहा था। उपरोक्त सभी कोड सही है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.