проблема glUnProject в Android - PullRequest
       43

проблема glUnProject в Android

0 голосов
/ 27 апреля 2011

В моей игре мне нужно выяснить, где игрок касается.MotionEvent.getX () и MotionEvent.getY () возвращают координаты окна.Поэтому я сделал эту функцию для проверки преобразования оконных координат в координаты OpenGL:

public void ConvertCoordinates(GL10 gl) {
        float location[] = new float[4];

        final MatrixGrabber mg = new MatrixGrabber(); //From the SpriteText demo in the samples.
        mg.getCurrentProjection(gl);
        mg.getCurrentModelView(gl);

        int viewport[] = {0,0,WinWidth,WinHeight};

        GLU.gluUnProject((float) WinWidth/2, (float) WinHeight/2, (float) 0, mg.mModelView, 0, mg.mProjection, 0, viewport, 0, location,0);
        Log.d("Location",location[1]+", "+location[2]+", "+location[3]+"");
    }

X и y колебались от почти -33 до почти +33.Z обычно 10. Я неправильно использовал MatrixGrabber или что-то в этом роде?

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Ваша ошибка исходит из размера выходных массивов.Им нужна длина 4, а не 3, как в коде выше.

1 голос
/ 29 апреля 2011

Что ж, для меня самым простым способом было представить, что щелчок на экране - это луч, который начинается в положении камеры и уходит в бесконечность

Чтобы получить этот луч, мне нужно было запросить его мировые координаты как минимум в 2 позициях Z (в виде координат).

Вот мой метод нахождения луча (я думаю, из того же демо-приложения для Android). Он прекрасно работает в моем приложении:

public void Select(float x, float y) {
    MatrixGrabber mg = new MatrixGrabber();
    int viewport[] = { 0, 0, _renderer.width, _renderer.height };

    _renderer.gl.glMatrixMode(GL10.GL_MODELVIEW);
    _renderer.gl.glLoadIdentity();
    // We need to apply our camera transformations before getting the ray coords 
    // (ModelView matrix should only contain camera transformations)
    mEngine.mCamera.SetView(_renderer.gl);

    mg.getCurrentProjection(_renderer.gl);
    mg.getCurrentModelView(_renderer.gl);

    float realY = ((float) (_renderer.height) - y);
    float nearCoords[] = { 0.0f, 0.0f, 0.0f };
    float farCoords[] = { 0.0f, 0.0f, 0.0f };
    gluUnProject(x, realY, 0.0f, mg.mModelView, 0, mg.mProjection, 0,
            viewport, 0, nearCoords, 0);
    gluUnProject(x, realY, 1.0f, mg.mModelView, 0, mg.mProjection, 0,
            viewport, 0, farCoords, 0);

    mEngine.RespondToClickRay(nearCoords, farCoords);
}

В OGL10 AFAIK у вас нет доступа к Z-буферу, поэтому вы не можете найти Z ближайшего объекта на экране координаты x, y. Вам нужно самостоятельно рассчитать первый объект, попавший под ваш луч.

...