使用GLU.glProject

时间:2017-04-11 05:37:55

标签: android opengl-es 3d 2d perspective

我有一个OpenGL场景,其半径为1的球体,相机位于球体的中心(它是一个360°的图片浏览器)。用户可以通过平移来旋转球体。

现在我需要在图片的某些部分显示“附加”的2D引脚。为此,我想将我的引脚的3D坐标转换为2D屏幕坐标,以在该屏幕坐标处添加引脚图像。

我正在使用GLU.glProject以及android-apidemo中的以下类:

  • MatrixGrabber
  • MatrixStack
  • MatrixTrackingGL

我将onSurfaceChanged方法中的投影矩阵和onDraw方法中的模型视图矩阵保存(绘制球体后)。然后,当用户旋转球体以更新引脚位置时,我将GLU.glProject与它们一起提供。

当我水平平移时,针脚正确平移,但是当我垂直平移时,纹理比针脚图像“更快”(就像针脚更接近相机而不是球体)。

以下是我的代码的一些相关部分:

public class CustomRenderer implements GLSurfaceView.Renderer {

    MatrixGrabber mMatrixGrabber = new MatrixGrabber();
    private float[] mModelView = null;
    private float[] mProjection = null;

    [...]

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

        // Get the sizes:
        float side = Math.max(width, height);
        int x = (int) (width - side) / 2;
        int y = (int) (height - side) / 2;

        // Set the viewport:
        gl.glViewport(x, y, (int) side, (int) side);

        // Set the perspective:
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl, FIELD_OF_VIEW_Y, 1, Z_NEAR, Z_FAR);

        // Grab the projection matrix:
        mMatrixGrabber.getCurrentProjection(gl);
        mProjection = mMatrixGrabber.mProjection;

        // Set to MODELVIEW mode:
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void onDrawFrame(GL10 gl) {

        // Load the texture if needed:
        if(mTextureToLoad != null) {

            mSphere.loadGLTexture(gl, mTextureToLoad);
            mTextureToLoad = null;
        }

        // Clear:
        gl.glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();

        // Rotate the scene:
        gl.glRotatef( (1 - mRotationY + 0.25f) * 360, 1, 0, 0); // 0.25 is used to adjust the texture position
        gl.glRotatef( (1 - mRotationX + 0.25f) * 360, 0, 1, 0); // 0.25 is used to adjust the texture position

        // Draw the sphere:
        mSphere.draw(gl);

        // Grab the model-view matrix:
        mMatrixGrabber.getCurrentModelView(gl);
        mModelView = mMatrixGrabber.mModelView;
    }

    public float[] getScreenCoords(float x, float y, float z) {

        if(mModelView == null || mProjection == null) return null;

        float[] result = new float[3];
        int[] view = new int[] {0, 0, (int) mSurfaceViewSize.getWidth(), (int) mSurfaceViewSize.getHeight()};

        GLU.gluProject(x, y, z,
                mModelView, 0,
                mProjection, 0,
                view, 0,
                result, 0);

        result[1] = mSurfaceViewSize.getHeight() - result[1];

        return result;
    }
}

我使用getScreenCoords方法的结果来显示我的引脚。 y值是错误的。

我做错了什么?

0 个答案:

没有答案