मैं ग्रिड पर यूनिट अनुवाद के साथ एक छोटी सी समस्या में कुछ अंतर्दृष्टि की तलाश कर रहा हूं।
अद्यतन और हल
मैंने अपनी समस्या हल कर ली। जानकारी के लिए नीचे देखें। पोस्ट के इस हिस्से में सब कुछ सही निकला। यदि कुछ भी यह अगले व्यक्ति के लिए लघु ट्यूटोरियल / उदाहरण / सहायता के रूप में कार्य कर सकता है।
सेट अप
- FBO, VAO, VBO
- 512x448 विंडो
- 64x64 ग्रिड
gl_Position = projection * world * position;
projection
द्वारा परिभाषित किया गया हैortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);
यह एक पाठ्यपुस्तक ऑर्थोगोनल प्रोजेक्शन फ़ंक्शन है।world
एक निश्चित कैमरा स्थिति द्वारा परिभाषित किया गया है (0, 0)position
स्प्राइट की स्थिति द्वारा परिभाषित किया गया है।
मुसीबत
नीचे स्क्रीनशॉट में (1: 1 स्केलिंग) ग्रिड रिक्ति 64x64 है और मैं यूनिट को 64 (64, 64) पर आरेखित कर रहा हूं, हालांकि यूनिट लगभग ~ 10px गलत स्थिति में आ रही है। मैंने पिक्सेल आकार पर किसी भी विकृति को रोकने के लिए समान विंडो आयामों की कोशिश की है, लेकिन अब मैं 1: 1 पिक्सेल-टू-वर्ल्ड-यूनिट प्रोजेक्शन प्रदान करने में उचित तरीके से थोड़ा खो गया हूं। किसी भी तरह, यहाँ समस्या में सहयोगी को कुछ त्वरित चित्र हैं।
मैंने इंजन के 64x ऑफसेट के बारे में स्प्राइट्स के एक समूह को सुपर-थोपने का फैसला किया।
जब यह बंद लग रहा था, तो मैंने 1 यूनिट के बेस केस के बारे में जाना। जो उम्मीद के मुताबिक लाइन में लग रहा था। आंदोलन में पीले रंग का 1px अंतर दिखाई देता है।
मैं क्या चाहता हूँ
किसी भी दिशा में आदर्श रूप से चलती हुई 64-इकाइयाँ निम्न (सुपर-इम्पोज्ड इकाइयाँ) का उत्पादन करेंगी:
कोने
ऐसा प्रतीत होता है कि शीर्ष की छाया में जाने वाले कोने सही हैं। उदाहरण के लिए, पहली छवि के संदर्भ में डेटा VBO में इस तरह दिखता है:
x y x y
----------------------------
tl | 0.0 24.0 64.0 24.0
bl | 0.0 0.0 -> 64.0 0.0
tr | 16.0 0.0 80.0 0.0
br | 16.0 24.0 80.0 24.0
पूर्णता के लिए यहां उपरोक्त आंदोलनों के अनुरूप वास्तविक सरणी है:
x y z w r g b a s t
-------------------------------------------------------------
tl | 0.0 23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.62650603
bl | 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.76506025
tr | 16.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.2263158 0.76506025
br | 16.0 23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.2263158 0.62650603
-------------------------------------------------------------
-------------------------------------------------------------
tl | 64.0 24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.21084337
bl | 64.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.3554217
tr | 80.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.3554217
br | 80.0 24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.21084337
// side bar: I know that I have unnecessary data with having a z-axis.
// The engine flips between perspective and orthogonal and I
// haven't selectively started pruning data.
प्रोजेक्शन मैट्रिक्स
512x448 विंडो के लिए प्रोजेक्शन मैट्रिक्स इस तरह दिखता है:
0.00390625 0.0 0.0 0.0
0.0 0.004464286 0.0 0.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 1.0
और एक पाठ्यपुस्तक ऑर्थोगोनल प्रोजेक्शन फ़ंक्शन के साथ बनाया गया है:
ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);
// explicitly: ortho(-512/2.0f, 512/2.0f, -448/2.0f, 448.0f
ortho(float left, float right, float bottom, float top)
{
projection.setIdentity();
projection.m00 = 2.0f / (right - left);
projection.m11 = 2.0f / (top - bottom);
projection.m22 = -1;
projection.m30 = -(right + left) / (right - left);
projection.m31 = -(top + bottom) / (top - bottom);
projection.m32 = 0;
}
विश्व-दृश्य मैट्रिक्स
कैमरे की स्थिति केवल एक अनुवाद मैट्रिक्स है, जो इस मामले में मैं -w / 2 और -h / 2 को ऑफसेट करता हूं ताकि केंद्र के सापेक्ष शून्य हो।
1.0 0.0 0.0 -256.0
0.0 1.0 0.0 -224.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
समाधान मैंने प्रयास किया है
player.moveRight()
पहलू में फैले पहलू अनुपात के साथ 1-यूनिट को स्थानांतरित करेगा। तो:gridWidth = 64 / 1.14f
। आंदोलन ग्रिड के भीतर फिट नहीं हुआ।एक मिलान ऑर्थोगोनल प्रक्षेपण के साथ एक 512x512 खिड़की को मजबूर किया।
विभिन्न जादुई संख्याओं की कोशिश की और दोनों के बीच संबंध बनाने की कोशिश की।
उस ने कहा, मुझे विश्वास है कि मैं अपने वास्तविक प्रक्षेपण को टटोल रहा हूं। इसलिए, मैं 1: 1 पिक्सेल-टू-वर्ल्ड-यूनिट प्रोजेक्शन को बनाए रखने में किसी भी अंतर्दृष्टि की तलाश कर रहा हूं।