2013-03-17 20 views
6

Bu yüzden OpenGL ES'de bir küre oluşturdum (özellikle, Android için Java'da OpenGL ES 2.0). Bu küre, görünüm matrisi için kullanılan merkezle aynı konuma yerleştirildiğinde, bu iyi bir şeydir, fakat merkezden uzaklaşıldığında küre oldukça kötü bir şekilde eğimlidir (aşağıya bakınız).(OpenGL ES) Görünüm merkezinden uzaktaki nesneler gerilir

Bu neden oluyor ve nasıl durduracağım? Aynı küre var

enter image description here

. Sağ üstteki sadece x ve y (z değil) ile çevrilir.

GLSurfaceView.renderer benim uygulanmasından kod Bazı parçacıkları,

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); 

} 

Ve gölgelendiriciler sade olmasına

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;" + 
    "}"; 

Ben Küre sınıfından neredeyse tüm kodunu bıraktım ve düşünmüyorum başka şeyler gerekli (?), ama gerekirse onlar onları koyacağım.

cevap

5

perspective distortion dünyasına hoş geldiniz!

Biraz daha fazla ayrıntı: Görüntü Alanınız çok dar, biraz daha büyük olacak şekilde frustumu şekillendirmeniz gerekecek.

+3

Aha! Ve şimdi neyi aradığımı biliyorum, elbette ki bilgiler kolayca elde edilebilir (yığın taşmasıyla ilgili benzer sorular. Buna rastlayanlar için bkz. Http://stackoverflow.com/a/8891510/927046 ve http://stackoverflow.com/a/13270443/927046.) Teşekkürler. – Sam

+1

Google'ın neyin en zor kısmı olduğunu bilmek :) Sevindim seni doğru yönde gösterebilirim. –

+0

Ayrıca, sorunun çok * geniş * görüş alanı olduğunu düşündüğümü eklemeliyim. Daha dar olması gerekiyordu (kamerayı yerleştirmek için telafi etmek için babayla birlikte). – Sam