ग्रिड पर ऑर्थोग्राफ़िक इकाई अनुवाद बेमेल (उदाहरण के लिए 64 पिक्सेल गलत तरीके से अनुवादित)


14

मैं ग्रिड पर यूनिट अनुवाद के साथ एक छोटी सी समस्या में कुछ अंतर्दृष्टि की तलाश कर रहा हूं।

अद्यतन और हल

मैंने अपनी समस्या हल कर ली। जानकारी के लिए नीचे देखें। पोस्ट के इस हिस्से में सब कुछ सही निकला। यदि कुछ भी यह अगले व्यक्ति के लिए लघु ट्यूटोरियल / उदाहरण / सहायता के रूप में कार्य कर सकता है।

सेट अप

  • 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 पिक्सेल-टू-वर्ल्ड-यूनिट प्रोजेक्शन प्रदान करने में उचित तरीके से थोड़ा खो गया हूं। किसी भी तरह, यहाँ समस्या में सहयोगी को कुछ त्वरित चित्र हैं।

एक 512x448 विंडो पर 64x64 टाइलें

मैंने इंजन के 64x ऑफसेट के बारे में स्प्राइट्स के एक समूह को सुपर-थोपने का फैसला किया।

64 ऑफसेट सुपर लगाए गए

जब यह बंद लग रहा था, तो मैंने 1 यूनिट के बेस केस के बारे में जाना। जो उम्मीद के मुताबिक लाइन में लग रहा था। आंदोलन में पीले रंग का 1px अंतर दिखाई देता है।

1 यूनिट का बेस केस

मैं क्या चाहता हूँ

किसी भी दिशा में आदर्श रूप से चलती हुई 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

समाधान मैंने प्रयास किया है

  1. player.moveRight()पहलू में फैले पहलू अनुपात के साथ 1-यूनिट को स्थानांतरित करेगा। तो: gridWidth = 64 / 1.14f। आंदोलन ग्रिड के भीतर फिट नहीं हुआ।

  2. एक मिलान ऑर्थोगोनल प्रक्षेपण के साथ एक 512x512 खिड़की को मजबूर किया।

  3. विभिन्न जादुई संख्याओं की कोशिश की और दोनों के बीच संबंध बनाने की कोशिश की।

उस ने कहा, मुझे विश्वास है कि मैं अपने वास्तविक प्रक्षेपण को टटोल रहा हूं। इसलिए, मैं 1: 1 पिक्सेल-टू-वर्ल्ड-यूनिट प्रोजेक्शन को बनाए रखने में किसी भी अंतर्दृष्टि की तलाश कर रहा हूं।


5
अच्छी तरह से निर्मित प्रश्न, लेकिन शायद हम आपके प्रक्षेपण और विश्व मैट्रिसेस को देख सकें। आपने उन्हें ऊपर उल्लेख किया है, लेकिन उनकी सामग्री को शामिल नहीं किया है। समस्या उन मैट्रिसेस में से एक के साथ होगी।
केन

@ कोई समस्या नहीं है। मैंने अपना प्रक्षेपण और विश्व-अंतरिक्ष दृश्य मैट्रिसेस जोड़ा है। मैंने अपने इच्छित आउटपुट और समस्या पर मेरे स्वयं के प्रयासों को भी शामिल किया है।
जस्टिन वैन हॉर्ने

आप मैच्योर दिखते हैं (मैंने उनकी तुलना ग्लोरोथो और ग्लोट्रांसलेट से की है। यहाँ तिनके हैं। लेकिन ओपेंगल को उम्मीद है कि इसके मैट्रिस कॉलम-मेजर ऑर्डर में व्यवस्थित होंगे, क्या आप भी ऐसा ही कर रहे हैं?
केन

एचएम, उन्हें कॉलम-मेजर ऑर्डर जमा किया जा रहा है।
जस्टिन वैन हॉर्न

जवाबों:


5

मैंने अपनी समस्या हल कर ली - और केवल एक सरल विवरण के रूप में इसे उड़ाने के बजाय, मैं इस मुद्दे पर बहस करने के लिए उठाए गए कदमों का वर्णन करना चाहता हूं। मैंने छोड़ दिया कि मैं विशेष प्रभावों के लिए एक एकल FBO का उपयोग कर रहा था।

सबसे पहले, यह पता चला है कि उपरोक्त सब कुछ वास्तव में सही है और एक कदम जो मैंने छोड़ा था वह समस्या थी।

  • मैंने अपने ऑर्थोगोनल मेट्रिसेस को और-के माध्यम से सत्यापित किया।
  • हर चीज का बाइट-ऑर्डर सत्यापित।
  • एक चौकोर बनावट बनाया। <- यहाँ जादू है
  • जब मैंने एक वर्ग बनावट बनाया, तो मैंने देखा कि यह स्क्रीन पर वर्ग नहीं था, लेकिन वर्कशीट में जा रहा है।
  • यह मेरा पहला सुराग था कि कुछ गलत था। स्क्रीन पर मेरे बनावट के आयाम उन आयामों से मेल नहीं खाते जो वर्टीकल शेडर में जा रहे थे।
  • मैं भूल गया कि मैं एक FBO (यहाँ मूर्खता आती है) का उपयोग कर रहा था।
  • FBO बनावट का आकार जो भी मूर्खतापूर्ण कारण के लिए मेरे viewport बनावट आकार से मेल नहीं खाता।
  • FBO को अक्षम कर दिया गया और परिणाम मेल खा गए।
  • मेरी बनावट के आकार और वाह-लाह को परिभाषित करने के साथ तर्क को तय किया।

Sillyness

मुझे खेद है अगर इसने किसी का समय लिया। मैं इस प्रश्न को किसी के लिए अच्छे उपाय के रूप में छोड़ दूंगा जो बिना किसी समस्या के उसी समस्या में चल सकता है।

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