Проблемы с изменением матрицы ортогональной проекции - PullRequest
3 голосов
/ 02 октября 2011

Я экспериментировал с 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 - это то, насколько сильно ваш палец двигался:

// 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 голос
/ 02 октября 2011

Что происходит, когда вы устанавливаете 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 голосов
/ 03 октября 2011

Я всегда узнал, что вы должны использовать матрицу проекции для перспективы, а не для камеры (сравните FAQ по OpenGL ).Поэтому я бы установил проекцию (перспективу) с помощью GLU один раз и больше не менял ее.В вашей процедуре прорисовки вы можете установить камеру (перевод) перед каждым розыгрышем или использовать glPushMatrix и glPopMatrix для безопасного и восстановления камеры .

...