Немного помощи Портирование этого урока - PullRequest
2 голосов
/ 28 июля 2011

Я пытаюсь использовать код в в этом уроке , но он написан не на том языке (OPEN-GL), поэтому я портирую его в OPENGL-ES как можно лучше. Это то, что я до сих пор:

public void coordinates (GL10 gl, int x, int y, int width, int height){
        int[] viewport = new int[4];
        gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
        int[] modelview = new int[16];
        gl.glGetIntegerv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
        int[] projection = new int[16];
        gl.glGetIntegerv(GL11.GL_PROJECTION_MATRIX, projection, 0);

        sety = viewport[3] - sety;
}

Получил ошибку от команды glReadPixel, потому что она не принимает это

gl.glReadPixels(setx, sety, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &setz);

Ошибка гласит, что GL_DEPTH_COMPONENT, GL_FLOAT и & setz не могут быть разрешены. Что такое альтернатива OPENGL-ES?

Также последняя часть урока, шаг 5, это совершенно новый метод или компиляция всего урока?

ПРИМЕЧАНИЕ: setx и sety являются частными числами, вызываемыми в верхней части моего кода

РЕДАКТИРОВАТЬ: У меня также возникают проблемы с командой gluUnProject, которая требует большего значения, чем версия opengl в учебнике.

(в opengl-es)

 GLU.gluUnProject(winX, winY, winZ, model, modelOffset, project, projectOffset, view, viewOffset, obj, objOffset)

(и в учебнике)

gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

EDIT:

Хорошо, я думаю, что в значительной степени решил свой собственный вопрос, но у меня все еще есть проблемы.

gl.glReadPixels 

требует этих переменных

glReadPixels(int, int, int, int, int, int, Buffer)

Что хорошо, но

GLU.gluUnproject

Требует, чтобы координата x (возвращенная в качестве буфера readpixels) была плавающей.

Также в учебнике NeHe UnProject возвращает три числа с плавающей запятой, но здесь, похоже, остается место только для одного, поэтому я понятия не имею, как получить переменные. Это мой текущий код glUnproject, который еще не соответствует принятому макету.

GLU.gluUnProject(setx, newsety, setz, modelview, 0, projection, 0, viewport, 0, posx, 0, posy, 0, posz, 0);

эти аргументы как таковые

 (float, float, buffer, int[], int, int[], int, int[], int, float, int, float, int, float, int)]

Когда они должны быть

(float, float, float, float[], int, float[], int, int[], int, float[], int)

EDIT:

Правильно, я решил, что могу покончить с командой readpixel, потому что моя игра 2D, и установка z в 0 должна работать ОК

так что проблема с буфером исчезла

Я изменил некоторые из моих переменных на значения с плавающей точкой, и теперь GLU.gluUnProject не возвращает ошибок. Однако я до сих пор не знаю, как вернуть переменные posx, posy, posz.

Вот мой код в его нынешнем виде.

 public void Vector3 (GL11 gl, int x, int y){
        int[] viewport = new int[4];
        float[] modelview = new float[16];
        float[] projection = new float[16];
        float winx, winy, winz;
        float posx, posy, posz;
        float[] Vector3 = new float[3];

        gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
        gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
        gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);

        winx = setx;
        winy = viewport[3] - sety;
        winz = 0;

        GLU.gluUnProject(winx, winy, winz, modelview, 0, projection, 0,     viewport, 0, Vector3, 0);

        return Vector3(posx, posy, posz);


    } 

setx, sety, setz являются глобальными переменными и возвращаемым Vector3 (posx, posy, posz); В данный момент строка возвращает ошибки.

Спасибо за помощь.

РЕДАКТИРОВАТЬ: Хорошо, думаю, я понял

Вот некоторый код (я включил метод события движения, потому что именно в этом проблема в данный момент, и метод рисования, чтобы дать некоторый контекст)

public synchronized void randomMethod(MotionEvent event){
        if (event.getAction() == MotionEvent.ACTION_DOWN){
        setx = event.getX();
        sety = event.getY();
        Vector3(null);
        }
    }

    public void Vector3 (GL11 gl){
        int[] viewport = new int[4];
        float[] modelview = new float[16];
        float[] projection = new float[16];
        float winx, winy, winz;
        float[] Vector3 = new float[3];

        gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
        gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
        gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);

        winx = setx;
        winy = viewport[3] - sety;
        winz = 0;


        GLU.gluUnProject(winx, winy, winz, modelview, 0, projection, 0, viewport, 0, Vector3, 0);

        posx = Vector3[1];
        posy = Vector3[2];
        posz = Vector3[3];


    }



 @Override
public void onDrawFrame(GL10 gl) {
         gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
            GL10.GL_DEPTH_BUFFER_BIT);

             gl.glLoadIdentity();
             gl.glPushMatrix();
    gl.glTranslatef(posx, posy, posz);
    gl.glScalef(100, 100, 0);
    square.draw(gl);        
    gl.glPopMatrix();
 }

Мой журнал ошибок показывает

07-30 10:41:03.220: ERROR/AndroidRuntime(340): Uncaught handler: thread main exiting due to uncaught exception
07-30 10:41:03.270: ERROR/AndroidRuntime(340): java.lang.NullPointerException
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.app.ui.GLSurfaceRenderer.Vector3(GLSurfaceRenderer.java:51)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.app.ui.GLSurfaceRenderer.randomMethod(GLSurfaceRenderer.java:40)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.app.ui.Practice.onTouchEvent(Practice.java:41)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.app.Activity.dispatchTouchEvent(Activity.java:2064)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1690)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.os.Looper.loop(Looper.java:123)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at android.app.ActivityThread.main(ActivityThread.java:4310)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at java.lang.reflect.Method.invokeNative(Native Method)
07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at java.lang.reflect.Method.invoke(Method.java:521)
 07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
 07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
 07-30 10:41:03.270: ERROR/AndroidRuntime(340):     at dalvik.system.NativeStart.main(Native Method)

У меня есть догадка, что проблема может быть вызвана тем, как я назвал Vector3 в randomMethod, но я не могу думать, как еще я мог бы добиться того же (возможно, это нулевой аргумент).

1 Ответ

2 голосов
/ 03 августа 2011

Это ваш нулевой аргумент.

Vector3 ожидает экземпляр GL11, но вы предоставляете его с нулем, это означает, что когда дело доходит до

gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);

gl = NULL иВы получаете нулевой указатель .

Если вы делаете это, чтобы вы могли просто получить координату Z, тогда вам придется разместить этот метод где-нибудь, где есть доступ к GL11

...