OpenGLES10:应用投影和投影相机视图

发布于 2024-12-10 04:42:56 字数 3299 浏览 0 评论 0原文

我需要一点帮助: Android 开发人员,教程:OpenGLES10。 一个链接

对于第一个三角形来说一切正常,直到我输入 Projection & 的代码相机视图。这应该调整 OpenGLES 方形视图的大小以匹配手机的屏幕,因此对象保持比例。 作为新手观看,代码看起来不错,并且我已经检查了参考文件,没有丢失参数或类似的东西。但现在我迷路了..!看不出有什么问题。 如果应用了投影和相机代码,则不存在三角形,而是应用程序。正在运行并显示具有背景颜色的视图。

这是我的代码:

    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

我希望有人能告诉我,哪里出了问题?

开发工具:Eclipse。

I need a little help with this:
android developers, Tutorials: OpenGLES10.
a link

It all works fine for the first Triangle, until I put in the code for Projection & Camera View. This should rezise OpenGLES Square view to match Phone's screen, so object stay in propotions.
As a Newbie watching, the code looks fine and i have cheked with referencefiles, that there's not missing a parameter or something like that. But now i'm lost..! Can't see what's wrong.
If Projection and Camera code are applied, there is no triangle, but the app. is runing and the View with backgroundcolor are shown.

Here is my code:

    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

I hope some one can tell me, where things go wrong?

DevTool: Eclipse.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眸中客 2024-12-17 04:42:56

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

I had the same problem with this tutorial and it got solved when I changed the order of multiplying in the vertex shader code in the Triangle class. So instead of having uMVPMatrix * vPosition, replace it with vPosition * uMVPMatrix. I guess the reason for this is because vPosition is a row vector.

夏九 2024-12-17 04:42:56

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

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

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

The code looks resonable (if you uncomment the parts that are commented out at the moment). Your matrix modification code is quite correct and all transformations are applied to the correct matrices.

But at the moment you are looking from the point (0,0,-5) to the point (0,0,0) and therefore along the +z axis. But since the default OpenGL view looks along the -z axis, you actually rotate the view 180 degrees around the y-axis. Whereas this is absolutely no problem, you now see the back-side of the triangle. So can it be, that you have back-face culling enabled and this back-side is just optimized away? Just try disabling back-face culling by calling glDisable(GL_CULL_FACE) or change the -5 in the gluLookAt call to a 5, so that you look along the -z axis.

You can also try to use gluPerspective(45, ratio, 3, 7) instead of the glFrustum call, but your arguments to glFrustum look quite reasonable. Of course, keep in mind that both calls create a perspective view, with farther objects getting smaller, like in reality. If you actually want a parallel/orthographic view (where size on screen is independent on depth) you should replace the glFrustum with a glOrtho, though the parameters can stay the same.

放赐 2024-12-17 04:42:56

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

Your call to gluLookAt trashes your modelview matrix. You should call this function with the projection matrix active.

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

This code shows the triangle for me:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文