2014-11-05 13 views
7

(एक टन दूसरों जो मैं खोजने के लिए परेशान नहीं कर रहा हूँ herehere, here, here, here, और, और) googling के दो घंटे के बाद, मैंने सोचा था कि मैंने अंततः 3 डी निर्देशांक को 2 डी निर्देशांक में बदलने का सिद्धांत सीखा था। लेकिन यह काम नहीं कर रहा है। विचार जहाज के 3 डी निर्देशांक को उस जहाज को नियंत्रित करने वाले प्लेयर के उपयोगकर्ता नाम को प्रस्तुत करने के लिए स्क्रीन पर 2 डी निर्देशांकों का अनुवाद करना है।gluProject 3 डी में कनवर्ट निर्देशांक 2 डी निर्देशांक में नहीं बदलता 2 डी वाई समन्वय सही ढंग से

हालांकि, पाठ गलत स्थान में प्रदर्शित हो रहा है: enter image description here

पाठ "टेस्ट || 2DXCoordinate || 2DZCoordinate" है।

यहां मेरा getScreenCoords() है - जो 3 डी निर्देशांक को 2 डी में परिवर्तित करता है।

public static int[] getScreenCoords(double x, double y, double z) { 
    FloatBuffer screenCoords = BufferUtils.createFloatBuffer(4); 
    IntBuffer viewport = BufferUtils.createIntBuffer(16); 
    FloatBuffer modelView = BufferUtils.createFloatBuffer(16); 
    FloatBuffer projection = BufferUtils.createFloatBuffer(16); 
    GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelView); 
    GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection); 
    GL11.glGetInteger(GL11.GL_VIEWPORT, viewport); 
    boolean result = GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords); 
    if (result) { 
     return new int[] { (int) screenCoords.get(0), (int) screenCoords.get(1) }; 
    } 
    return null; 
} 

स्क्रीनकॉर्ड्स.get (0) एक पूर्ण एक्स समन्वय लौट रहा है। हालांकि, शिपकॉर्ड्स.जेट (1) जहाज से कितनी दूर है इस पर निर्भर करता है कि यह उच्च या निम्न हो रहा है। डिबगिंग के कई घंटे के बाद, मैं इसे इस लाइन गलत किया जा रहा है को संकुचित होता है:

GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords); 

हालांकि, मुझे नहीं पता कि क्या गलत है। जहाज का एक्स समन्वय ठीक है .... वाई क्यों नहीं?

बीडीएल के उत्तर के अनुसार, मैं gluProject() को "गलत मैट्रिक्स" की आपूर्ति कर रहा हूं। लेकिन मुझे नहीं लगता कि यह कैसे संभव है, क्योंकि मैं अपने जहाज को प्रस्तुत करने के बाद विधि को सही कहता हूं (जो स्पष्ट रूप से जहाज में जो कुछ भी मैट्रिक्स खींचता है)।

मैं बस गलत क्या नहीं समझ सकता।

नोट: बीडीएल का जवाब पूरी तरह से पर्याप्त है सिवाय इसके कि यह स्पष्ट नहीं करता है कि वाई निर्देशांक गलत क्यों हैं।

नोट: यह प्रश्न बहुत लंबा और अधिक अस्पष्ट होता था। मैंने डिबगिंग के घंटों के बाद उपरोक्त मेरा संकुचित प्रश्न पोस्ट किया है।

+0

1. आप अपने कोड में कहीं अपने GL_MODELVIEW-मैट्रिक्स की स्थापना कर रहे हैं? मेरे लिए ऐसा लगता है कि यह एक पहचान मैट्रिक्स है। 2. क्या ऑर्थोग्राफिकप्रोजेक्शनमैट्रिक्स में आपके जहाज को प्रस्तुत करने के लिए उपयोग किए जा रहे परिप्रेक्ष्य प्रक्षेपण शामिल हैं? – BDL

+0

@BDL ऑर्थोग्राफिकप्रोजेक्शनमैट्रिक्स में प्रक्षेपण शामिल है जिसका उपयोग मैं पाठ प्रस्तुत करने के लिए कर रहा हूं। जहाज नहीं – Joehot200

+0

आपके द्वारा पोस्ट किए गए दूसरे कोडब्लॉक में आप अपने प्रक्षेपण मैट्रिक्स में ऑर्थोग्राफिक प्रोजेक्शनमैट्रिक्स लोड कर रहे हैं। इस मैट्रिक्स की सामग्री क्या है? और मेरे लिए ऐसा लगता है कि आपने कभी भी मॉडलव्यू मैट्रिक्स सेट नहीं किया है। जहाज को खींचते समय क्या आप कभी gltranslatef/glRotatef को कॉल नहीं करते? – BDL

उत्तर

5

आपको ग्लूप्रोजेक्ट में एक ही प्रक्षेपण मैट्रिक्स का उपयोग करना है जिसका उपयोग आप अपने जहाज को प्रस्तुत करने के लिए करते हैं। आपके मामले में जहाज को परिप्रेक्ष्य प्रक्षेपण का उपयोग करके प्रस्तुत किया जाता है, लेकिन जब आप ग्लूप्रोजेक्ट को ऑर्थोग्राफिक प्रोजेक्शन का उपयोग करते हैं तो इसका उपयोग किया जाता है।

जनरल सिद्धांत के बारे में ओपन

में सिस्टम समन्वय अपने दृश्य में एक मॉडल (जैसे जहाज) के अधिकांश मामलों ज्यामिति में एक मॉडल-समन्वय प्रणाली में दी गई है। यह वह जगह है जहां आपके कशेरुक निर्देशांक मौजूद हैं। जब आप अपने दृश्य में मॉडल डालते हैं तो हम दृश्य में जहाज के समन्वय प्राप्त करने के लिए प्रत्येक चरम पर मॉडल-मैट्रिक्स लागू करते हैं। इस समन्वय प्रणाली को विश्व अंतरिक्ष कहा जाता है। किसी दिए गए व्यूपॉइंट और दृश्य दिशा से दृश्य को देखते समय, फिर एक परिवर्तन की आवश्यकता होती है जो दृश्य को बदलती है जैसे व्यूपॉइंट मूल (0,0,0) में स्थित है और दृश्य-दिशा नकारात्मक से ज़ेड-अक्ष के साथ है। यह समन्वय प्रणाली देखें। अंतिम चरण व्यू-निर्देशांक को एनएनडीसी में परिवर्तित करना है, जो एक प्रोजेक्शन मैट्रिक्स के माध्यम से किया जाता है।

v_screen = Projection * View * Model * v_model 

प्राचीन ओपन में (के रूप में आप इसे उपयोग) देखें और मॉडल ModelView मैट्रिक्स में एक साथ जमा हो जाती है:

कुल में हम एक शीर्ष के परिवर्तन स्क्रीन के रूप में मिलता है।

(मैं यहाँ कुछ समस्याओं परिप्रेक्ष्य विभाजन के रूप में छोड़ दिया है, लेकिन यह समस्या को समझने के लिए पर्याप्त होना चाहिए।)

आपकी समस्या

आप पहले से ही दुनिया अंतरिक्ष में एक स्थिति है (एक्स, वाई, जेड) अपने जहाज के। इस प्रकार मॉडल के साथ परिवर्तन पहले से ही खुश है। क्या बचा है

v_screen = Projection * View * v_worldspace 

इस हम देखते हैं के लिए है, gluProject के लिए दर्ज हो जाता है कि कि हमारे मामले में ModelView मैट्रिक्स वास्तव में देखें मैट्रिक्स हो गया है।

मैं आपको नहीं बता सकता कि आपको अपने कोड में दृश्य मैट्रिक्स कहां मिल रहा है, क्योंकि मुझे आपके कोड का यह हिस्सा नहीं पता है।

+0

मैंने ओपी को नए कोड के साथ अपडेट किया। इसने निश्चित रूप से इसे बेहतर बना दिया है, आपके सुझाव के लिए बहुत धन्यवाद, लेकिन किसी कारण से कोड अभी भी सही नहीं है और काम नहीं करता है। – Joehot200

+0

सबसे अधिक संभावना है क्योंकि आपके पास मॉडेलव्यू मैट्रिक्स के साथ एक ही समस्या है। यदि (x, y, z) विश्व निर्देशांक में हैं, तो आपके मॉडलवेल मैट्रिक्स में केवल दृश्य मैट्रिक्स होना चाहिए, लेकिन मॉडल मैट्रिक्स नहीं। – BDL

+0

क्या? मुझे समझ में नहीं आता, क्षमा करें। जहाज के प्रस्तुत होने के बाद मैंने सटीक रेखा पर 2 डी निर्देशांक सेट किए। क्या यह सही नहीं है? और मैं मॉडल मैट्रिक्स कैसे नहीं बना सकता लेकिन केवल दृश्य मैट्रिक्स? – Joehot200

0

मुझे मेरी समस्या का उत्तर मिला!

मैं

font.drawString(drawx - offset, drawy, (sh.username + " || " + drawx + " | " + drawy), Color.orange); 

इस्तेमाल किया जब यह किया जाना चाहिए था

font.drawString(drawx - offset, Display.getHeight() - drawy, (sh.username + " || " + drawx + " | " + drawy), Color.orange); 
संबंधित मुद्दे