触摸坐标和OpenGL空间坐标

时间:2015-01-25 13:34:19

标签: android opengl-es

我很难实现屏幕上OpenGL形状的旋转和移动。基本上,我想要实现的是能够使用触摸屏控制形状。 无论我触摸哪里,它都应该向那个方向旋转并开始向前移动直到它到达那里。

以下是onSurfaceChanged()中设置平截头体和相机的代码:

    glViewport(0, 0, width, height);

    float sizeRatio = (float) width / height;

    Matrix.frustumM(
            projectionMatrix, 0, -sizeRatio, sizeRatio, -1.0f, 1.0f, 1.0f, 20.0f
    );
    Matrix.setLookAtM(
            viewMatrix, 0, 0, 0, -60, 0f, 0f, 0f, 0.0f, 1.0f, 0.0f
    );
    Matrix.multiplyMM(globalMvpMatrix, 0, projectionMatrix, 0, viewMatrix, 0);

以及onTouchEvent()处理触摸输入的方式(shape是存储位置和旋转的对象,然后在屏幕上绘制形状):

        lastTouchX = event.getX();
        lastTouchY = event.getY();

        float shapePosX = shape.getPositionX();
        float shapePosY = shape.getPositionY();

        int[] viewport = new int[4];
        glGetIntegerv(GL_VIEWPORT, viewport, 0);

        float[] unprojectedTouchCoords = new float[4];
        GLU.gluUnProject(
                lastTouchX, lastTouchY, 0,
                viewMatrix, 0,
                projectionMatrix, 0,
                viewport, 0,
                unprojectedTouchCoords, 0
        );
        float unprojectedX = unprojectedTouchCoords[0] / unprojectedTouchCoords[3];
        float unprojectedY = unprojectedTouchCoords[1] / unprojectedTouchCoords[3];
        float rotation = 90 - (float) Math.toDegrees(Math.atan2(
                shapePosY - unprojectedY, shapePosX - unprojectedX
        ));

        shape.setRotation(rotation);

        float moveX = 2 * (float) Math.cos(Math.toRadians(rotation));
        float moveY = 2 * (float) Math.sin(Math.toRadians(rotation));

        shape.move(moveX, moveY);

然而,它似乎并不好用。形状在错误的方向上移动,并且只有在形状的位置为(0,0)时旋转才是正确的。在任何其他情况下,它都会中断。

我想这个问题涉及相机与OpenGL空间中的形状之间的距离,但我不知道在哪里以及如何解决这个问题。我试着让相机更接近形状,但没有明显改善。

你能帮帮我吗?我真的很沮丧。

2 个答案:

答案 0 :(得分:0)

我没有深入研究你的代码,但我真的想给你一个建议:转换的顺序在OpenGL中很重要,因为它们是累积的。 这意味着 rotate and translate translate and rotate 不同。

Here是了解我所说的内容的良好起点。

答案 1 :(得分:0)

好像你有协调计算问题。您需要@Override onTouchEvent的{​​{1}}方法,其余位于

之下
GLSurfaceView