2016-06-08 8 views
5

मैं एंड्रॉइड के लिए एक डाइस रोलर ऐप बना रहा हूं। कोटलिन, ओपनजीएल-ईएस और जेबलेट का उपयोग करना। मैंने पासा लागू किया है। अब मुझे दीवारें बनाने की जरूरत है, क्योंकि अन्यथा पासा स्क्रीन से बाहर हो जाएगी।ओपनजीएल निर्देशांक में स्क्रीन निर्देशांक कनवर्ट करें

क्योंकि स्क्रीन में विभिन्न पहलू अनुपात हो सकते हैं, मैं glUnProject के साथ दीवारों की स्थिति निर्धारित करने की कोशिश कर रहा हूं, लेकिन मैं इसे समझ नहीं सकता। मुझे प्राप्त निर्देशांक सही नहीं हैं।

gl.glViewport(0,0,width,height) //Reset The Current Viewport 
    gl.glMatrixMode(GL10.GL_PROJECTION) //Select The Projection Matrix 
    gl.glLoadIdentity()     //Reset The Projection Matrix 

    //Calculate The Aspect Ratio Of The Window 
    GLU.gluPerspective(gl, 35.0f, width.toFloat()/height.toFloat(), 0.1f, 100.0f) 

    GLU.gluLookAt(gl, 
      0.0f, 30.0f, 0.0f, //Pos 
      0.0f, 0.0f, 0.0f, //Look at 
      0.0f, 0.0f, 1.0f //Up 
    ); 

    gl.glMatrixMode(GL10.GL_MODELVIEW) //Select The Modelview Matrix 
    gl.glLoadIdentity()     //Reset The Modelview Matrix 

    // Get matrices 
    gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, glProjectionMatrix,0) 
    gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, glModelMatrix,0) 
    gl.glGetIntegerv(GL11.GL_VIEWPORT, glViewPort,0) 

    // Allocate matrices 
    var modelMatrix = glModelMatrix 
    var projMatrix = glProjectionMatrix 
    var view = glViewPort 

    // Pre allocate wall positions 
    var wallDown = FloatArray(4) 

    // The needed point 
    var wallDownP = Vector3f(view[2].toFloat(), view[3].toFloat(), 0.2888888f) 

    GLU.gluUnProject(wallDownP.x, wallDownP.y, wallDownP.z, modelMatrix, 0, projMatrix, 0, view, 0, wallDown, 0) 
+0

आप उस 0.2888888f से कहां से प्राप्त हुए? – 246tNt

+0

यदि आप दीवारों को चाहते हैं तो आप व्यूपोर्ट को 2 से क्यों विभाजित करते हैं? और दीवार से आप शायद अपने कैमरे के दृश्य के किनारे मतलब है? – Spidfire

उत्तर

2

gluPerspective आपके मामले में थोड़ा दुर्भाग्यपूर्ण हो सकता है। यह देखने के क्षेत्र द्वारा परिभाषित frustum ऑपरेशन से एक सुविधा है।

यह सब सेटअप आप इस समय कर रहे हैं से संभव है लेकिन मैं आपको नहीं बल्कि frustum सीधे का उपयोग के रूप में यह आसान हो जाएगा गणना करने के लिए सुझाव देते हैं:

छिन्नक सीमा मानकों (top, bottom, left द्वारा परिभाषित किया गया है , right), near और farnear की दूरी के साथ सीमा पैरामीटर के साथ आयत बिल्कुल पूर्ण स्क्रीन होगी। तो बोर्ड के साथ शुरू करना सबसे अच्छा है। यदि आप बोर्ड को (viewWidth, viewHeight) आकार के रूप में परिभाषित करते हैं और चौड़ाई में fov=35 देखने का क्षेत्र चाहते हैं तो d इस ऑब्जेक्ट को d*tan(35/2)=viewWidth/2d=viewWidth/(2*tan(35/2)) होना चाहिए जो अब अपेक्षाकृत बड़ा मूल्य है। दूरी d अब far के रूप में उपयोग की जा सकती है क्योंकि मुझे लगता है कि आप बोर्ड के पीछे कुछ भी नहीं खींचेगा, बल्कि यह सुनिश्चित करने के लिए कि उपयोगकर्ता d*2 है। (far बढ़ाना गहराई बफर की परिशुद्धता को कम करेगा लेकिन कुछ भी नहीं)। तो अब आप 0.1 की तरह कुछ के रूप में near परिभाषित कर सकते हैं जहां तो वस्तु प्रक्षेपण के पैमाने scale=near/d है और सीमा मान तो पैमाने से गुणा मूल मान हैं:

  • left = -screenWidth/2*scale
  • right = screenWidth/2*scale
  • top = screenHeight/2*scale
  • bottom = -screenHeight/2*scale

तो इस सेटअप को आप (viewWidth, viewHeight) के आयत के आयत को d पर पूरी तरह से पूर्ण स्क्रीन के रूप में देखेंगे। तो dlookAt पैरामीटर में डालें और यह सब होना चाहिए। पासा का आकार तब स्क्रीन चौड़ाई द्वारा परिभाषित किया जा सकता है, इसलिए यह सभी उपकरणों पर समान दिखाई देता है। उदाहरण के लिए पासा आकार के लिए screenWidth/10 का उपयोग करके आप स्क्रीन पर क्षैतिज रूप से ठीक से 10 डायस फिट करने में सक्षम होंगे।

+0

धन्यवाद, मेरे लिए काम करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे