更改正交投影矩阵存在的问题

3

我正在尝试使用OpenGLES,并制作了一些简单的正方形在屏幕上移动:

    //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 的值,其中 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颜色)。 有人知道发生了什么吗? 我使用的矩阵是否有误?
2个回答

1
当您将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
        }
}

如果我将它们设置为0,我会得到同样糟糕的结果。我不知道为什么,因为我在其他任何地方都没有翻译投影矩阵。这让我疯狂,我该怎么办? - user717572
我的猜测是你的投影矩阵在其他地方被设置了。我建议用另一种方式来做,参见编辑。 - Hannesh

0
我一直学习说,透视应该使用投影矩阵,而不是相机(参见OpenGL FAQ)。所以我会使用GLU设置透视一次,然后不再更改它。在你的绘制程序中,你可以在每次绘制前设置相机(平移),或者使用glPushMatrixglPopMatrix来保存和恢复相机

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接