OpenGLES10:应用投影和相机视图



我需要一点帮助:android开发者教程:OpenGLES10。一个链接

对于第一个三角形来说一切都很好,直到我放入投影&相机视图。这将调整OpenGLES Square视图以匹配手机屏幕,因此对象保持比例。作为一个新手看,代码看起来很好,我已经检查了参考文件,没有遗漏一个参数或类似的东西。但现在我迷路了!看不出有什么问题。如果投影和相机代码应用,没有三角形,但应用程序正在运行,并显示背景色的视图。

下面是我的代码:
    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。

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

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

但现在你是从点(0,0,-5)到点(0,0,0),因此沿着+z轴。但是因为默认的OpenGL视图沿着-z轴看,你实际上围绕y轴旋转视图180度。这完全没有问题,你现在看到三角形的背面。有没有可能,你启用了背面剔除而背面被优化掉了?只需通过调用glDisable(GL_CULL_FACE)或将gluLookAt调用中的-5更改为5来禁用背面剔除,以便您沿着-z轴查看。

您也可以尝试使用gluPerspective(45, ratio, 3, 7)而不是glFrustum调用,但是您对glFrustum的参数看起来相当合理。当然,请记住,这两个调用都创建一个透视图,更远的对象变得更小,就像在现实中一样。如果你真的想要一个平行/正交视图(屏幕大小与深度无关),你应该用glOrtho替换glFrustum,尽管参数可以保持不变。

对gluLookAt的调用会破坏你的modelview矩阵。你应该在激活投影矩阵时调用这个函数。

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

最新更新