मैं एक विश्वविद्यालय परियोजना के लिए बीएसपी दर्शक लिख रहा हूं। अब तक मेरे पास मुख्य ज्यामिति ठीक से लोड है, और पीवीएस काम कर रहा है।
अब मैं 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);
हालाँकि यह इस तरह दिखता है:
यहाँ एक शीर्ष के लिए बनावट समन्वय '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
यह रास्ता बंद लगता है।