OpenGLES10:应用Projection&相机视图

时间:2011-10-16 14:42:17

标签: android opengl-es

我需要一点帮助: android开发人员,教程:OpenGLES10。 a link

这一切都适用于第一个三角形,直到我输入Projection&的代码。相机视图。这应该重新设置OpenGLES Square视图以匹配Phone的屏幕,因此对象保持在propotions中。 作为一个新手看,代码看起来很好,我已经与参考文件cheked,没有错过参数或类似的东西。但现在我迷路了......!看不出有什么不对。 如果应用了Projection和Camera代码,则没有三角形,但应用程序。正在运行,并显示带有backgroundcolor的视图。

这是我的代码:

    package notme.helloopengles10;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView;
import android.opengl.GLU;

public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {

// Set the background frame color
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

    // initialize the triangle vertex array
    initShapes();
    //enable use of vertex arrays
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}

public void onDrawFrame(GL10 gl) {
    // Redraw background color  
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

 /* // set GL_MODELVIEW transformation mode (If outline from here to after GLU.gluLookAt() - it works when also outlines further down i code!
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();  // reset Matrix to its default state

    // when using GL_MODELVIEW, you must set the view point
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);  */

    //Draw Triangel
    gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}

// Redraw on orientation changes // adjust for screen size ratio
public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);

    // Make adjustments  for screen ratio 
 /*(If outline from here to after gl.Frumstumf() - it works!
    float ratio = (float) width / height;
    gl.glMatrixMode(GL10.GL_PROJECTION);  // set matrix to projection mode
    gl.glLoadIdentity();                  // reset the matrix to its default state
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7);        // apply the projection   */

}

/*
 * Draw a shape, a triangle. first add new member variable to contain
* the vertices of a triangle
*/
 private FloatBuffer triangleVB;

//Create a method, initShaoe(), which populate the members variable
 private void initShapes(){
     //create a array 
     float triangleCoords[] = {
             // X, Y, Z
             -0.5f, -0.25f, 0,
             0.5f, -0.25f, 0,
             0.0f, 0,559016994f, 0
     };
 // initialize vertex Buffer for triangle
     ByteBuffer vbb= ByteBuffer.allocateDirect(
             //(# of coordinates values * 4 bytes per float)
             triangleCoords.length * 4 );
     vbb.order(ByteOrder.nativeOrder()); // use device hardware's native byte order
     triangleVB = vbb.asFloatBuffer(); //create floating point buffer from the ByteBuffer
     triangleVB.put(triangleCoords);  // add coordinates to the FloatBuffer
     triangleVB.position(0);  // set the buffer to read the first coordinate
 }


} // end

我希望有人可以告诉我哪里出了问题?

DevTool:Eclipse。

3 个答案:

答案 0 :(得分:1)

我在本教程中遇到了同样的问题,当我在三角形类中更改顶点着色器代码中的乘法顺序时,它得到了解决。因此,不要使用uMVPMatrix * vPosition,而是将其替换为vPosition * uMVPMatrix。我想这是因为vPosition是一个行向量。

答案 1 :(得分:0)

代码看起来很合理(如果您取消注释当前注释掉的部分)。您的矩阵修改代码非常正确,所有转换都应用于正确的矩阵。

但目前你正在从点(0,0,-5)到点(0,0,0)并因此沿着+ z轴看。但由于默认的OpenGL视图沿-z轴看,实际上您将视图围绕y轴旋转180度。虽然这绝对没有问题,但现在您可以看到三角形的背面。那么,你是否可以启用背面剔除,这个背面是否被优化了?只需尝试通过调用glDisable(GL_CULL_FACE)或将-5调用中的gluLookAt更改为5来禁用背面剔除,以便沿-z轴查看。

您也可以尝试使用gluPerspective(45, ratio, 3, 7)代替glFrustum来电,但您对glFrustum的论证看起来很合理。当然,请记住,两个调用都会创建一个透视图,更远的对象会变得更小,就像在现实中一样。如果您确实需要平行/正交视图(屏幕上的大小与深度无关),则应将glFrustum替换为glOrtho,但参数可以保持不变。

答案 2 :(得分:-1)

您对gluLookAt的调用会破坏您的模型视图矩阵。你应该在投影矩阵激活的情况下调用这个函数。

http://www.opengl.org/sdk/docs/man/xhtml/gluLookAt.xml

此代码显示了我的三角形:

public void onDrawFrame(GL10 gl) {
    // Redraw background color  
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    // when using GL_MODELVIEW, you must set the view point
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

 // set GL_MODELVIEW transformation mode (If outline from here to after GLU.gluLookAt() - it works when also outlines further down i code!
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();  // reset Matrix to its default state

    //Draw Triangel
    gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}