2013-03-17 6 views
6

फैलाए गए हैं इसलिए मैंने ओपनजीएल ईएस (विशेष रूप से, एंड्रॉइड के लिए जावा में ओपनजीएल ईएस 2.0) में एक क्षेत्र उत्पन्न किया है। जब यह क्षेत्र मेरे दृश्य मैट्रिक्स के लिए उपयोग किए जाने वाले केंद्र के समान स्थिति में रखा जाता है, तो यह ठीक है, लेकिन जब केंद्र से बाहर क्षेत्र बहुत बुरी तरह खराब हो जाता है (नीचे देखें)।(ओपनजीएल ईएस) दृश्य केंद्र से दूर ऑब्जेक्ट

यह क्यों हो रहा है, और मैं इसे कैसे रोकूं?

enter image description here

एक ही क्षेत्र है कि। ऊपरी दाएं में से एक का अनुवाद एक्स और वाई (ज़ेड नहीं) में किया जाता है।

GLSurfaceView.renderer की मेरी कार्यान्वयन से कोड के कुछ टुकड़े,

public void onSurfaceCreated(GL10 unused, EGLConfig config) { 
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    GLES20.glEnable(GLES20.GL_CULL_FACE); 
    GLES20.glEnable(GLES20.GL_DEPTH_TEST); 

    // Both centred on (0,0,0), of radius 1.0. 
    outerSphere = new Sphere(); 
    centreSphere = new Sphere(); 
} 

public void onSurfaceChanged(GL10 unused, int width, int height) { 
    GLES20.glViewport(0, 0, width, height); 

    ratio = (float) width/height; 

    final float left = -ratio; 
    final float right = ratio; 
    final float bottom = -1.0f; 
    final float top = 1.0f; 
    final float near = 1.0f; 
    final float far = 100.0f; 

    Matrix.frustumM(projMatrix, 0, left, right, bottom, top, near, far); 
} 

public void onDrawFrame(GL10 unused) { 
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

    float eyeX = 0.0f; 
    float eyeY = 0.0f; 
    float eyeZ = 10.0f; 

    final float lookX = 0.0f; 
    final float lookY = 0.0f; 
    final float lookZ = 0.0f; 

    final float upX = 0.0f; 
    final float upY = 1.0f; 
    final float upZ = 0.0f; 

    Matrix.setLookAtM(viewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, 
         upX, upY, upZ); 

    // Set identity matrix as input for translations. 
    Matrix.setIdentityM(outerModelMatrix, 0); 

    // Translate outer sphere by 5 in x and y. 
    Matrix.translateM(outerModelMatrix, 0, 5.0f, 5.0f, 0.0f); 

    // MVP matrix = Projection * View * Model. 
    Matrix.multiplyMM(centreMVPMatrix, 0, viewMatrix, 0, centreModelMatrix, 0); 
    Matrix.multiplyMM(centreMVPMatrix, 0, projectionMatrix, 0, centreMVPMatrix, 0); 
    Matrix.multiplyMM(outerMVPMatrix, 0, viewMatrix, 0, outerModelMatrix, 0); 
    Matrix.multiplyMM(outerMVPMatrix, 0, projectionMatrix, 0, outerMVPMatrix, 0); 

    outerSphere.draw(outerMVPMatrix); 
    centreSphere.draw(outerMVPMatrix); 

} 

और मेरी shaders बस कर रहे हैं,

private final static String vertexShaderCode = 
    "uniform mat4 u_MVPMatrix;" + 
    "attribute vec4 a_Position;" + 
    "uniform vec4 u_Color;" + 
    "void main() {" + 
    " gl_Position = u_MVPMatrix * a_Position;" + 
    "}"; 
private final static String fragmentShaderCode = 
    "precision mediump float;" + 
    "uniform vec4 u_Color;" + 
    "void main() {" + 
    " gl_FragColor = u_Color;" + 
    "}"; 

मैं क्षेत्र वर्ग से लगभग सभी कोड बाहर छोड़ दिया गया है, और अन्य चीजें जिन्हें मैं नहीं सोचता वे आवश्यक हैं (?), लेकिन यदि उनकी आवश्यकता है तो मैं उन्हें रखूंगा।

उत्तर

5

perspective distortion की दुनिया में आपका स्वागत है!

थोड़ा और विस्तार: आपका फ़ील्ड-ऑफ-व्यू बहुत संकीर्ण है, आपको निराशा को आकार देना होगा ताकि यह थोड़ा बड़ा हो।

+3

आह! और अब मुझे पता है कि मैं क्या देख रहा हूं, बेशक जानकारी आसानी से उपलब्ध है (इंक। स्टैक ओवरफ्लो पर इसी तरह के प्रश्न। इस पर आने वाले किसी भी व्यक्ति के लिए, उदाहरण के लिए http://stackoverflow.com/a/8891510/927046 देखें और http://stackoverflow.com/a/13270443/927046।) धन्यवाद। – Sam

+1

Google को जानना अक्सर सबसे मुश्किल हिस्सा है :) खुशी है कि मैं आपको सही दिशा में इंगित कर सकता हूं। –

+0

मुझे यह भी जोड़ना चाहिए कि मुझे लगता है कि समस्या एक बहुत विस्तृत * फ़ील्ड-ऑफ-व्यू थी। इसे संकुचित होने की आवश्यकता थी (कैमरा के साथ पिता को क्षतिपूर्ति करने के लिए दूर रखा गया था)। – Sam

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