android - 改变正交投影矩阵的问题

标签 android opengl-es matrix orthographic

我正在试验 opengles,并制作了一些在屏幕上移动的简单方 block :

    //inside my renderScreen() method, called from onDrawFrame()
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    if (gameObjects != null) {
        // iterate and draw objects
        for (GameObject obj : gameObjects) {
            if (obj != null) {
                gl.glLoadIdentity();
                gl.glTranslatef(obj.posX, obj.posY, 0.0f);
                obj.doDraw(gl);
            }

很简单,将对象绘制到屏幕上(仍在工作)。现在我想通过基于触摸输入转换投影矩阵来在屏幕上拖动。我在之前的代码之上添加了这段代码(在绘制对象之前)

//change projection matrix
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glTranslatef(-cameraX, -cameraY, 0.0f); //cameraX and cameraY set in updateGame()  

updateGame 只是从 MyPanel.getDiffX() 获取那些,其中 DiffX 就是您的手指移动了多少:

// Inside MyPanel Class
public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                startingX = event.getX();
                startingY = event.getY();
                MyRenderer.addObject(new GameSquare(event.getX(), v
                        .getHeight() - event.getY())); // Y is inverted!
            }
            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                diffX = (event.getX() - startingX) / 100;
                //diffY = (event.getX() - startingY) / 1000;
                Log.d("diffX" ,Float.toString(diffX));
            }
            return true;
        }

现在,如果我使用代码来平移投影矩阵,我就再也看不到屏幕上的任何对象(只有 glClear 颜色)。有谁知道发生了什么事?我使用的矩阵有误吗?

最佳答案

当您将 cameraX 和 cameraY 设置为 0 时会发生什么?通过改变投影矩阵,你确定你没有覆盖一些以前设置的值吗?

除此之外,您应该通过 -cameraX 和 -cameraY 进行翻译。想一想,如果你想让你的相机在位置 (10, 10),那么 (10, 10) 处的任何东西经过相机变换后都应该在原点,逻辑平移就是 (-10, -10) .您不是在世界中转换相机,而是在转换相机周围的世界。

编辑:让我建议一种替代方法,它不会改变投影矩阵。

//inside my renderScreen() method, called from onDrawFrame()
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glTranslate(-cameraX, -cameraY, 0); //Apply the camera here
if (gameObjects != null){
    // iterate and draw objects
    for (GameObject obj : gameObjects) {
        if (obj != null) {
            gl.glPushMatrix(); //Note this line here, we 'push' a matrix onto the top
            gl.glTranslatef(obj.posX, obj.posY, 0.0f);
            obj.doDraw(gl);
            gl.glPopMatrix(); //Here we remove our modified matrix to get the original one
        }
}

关于android - 改变正交投影矩阵的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626573/

相关文章:

Android/Web 应用程序离线/在线数据库设置。在两个平台上创建项目

android - 如何使用DELPHI在Android设备上更改通知中的小图标图像

opengl-es - OpenGL ES :Purpose of calling glClear on every frame

performance - 是否有最有效的方法来编写平均聚类系数的程序

python - Numpy 将数组乘以矩阵(外积)

java - Android 服务未从设置中初始化变量

java - android 从 PreferenceScreen 中的图库中选择图像?

c - 向函数发送指针数组

Android OpenGL ES 图像失真

c - 如何使用c中的指针将两个矩阵相加?