Android OpenGL:模型视图和投影矩阵
我想使用gluUnProject进行三维拾取。它返回错误的值。我认为原因是ModelView和投影矩阵生成不正确。为了获取它们,我使用API演示中的MatrixGrabber、MatrixStack和MatrixTrackingGL类:Android OpenGL:模型视图和投影矩阵,android,opengl-es,projection-matrix,Android,Opengl Es,Projection Matrix,我想使用gluUnProject进行三维拾取。它返回错误的值。我认为原因是ModelView和投影矩阵生成不正确。为了获取它们,我使用API演示中的MatrixGrabber、MatrixStack和MatrixTrackingGL类: MatrixGrabber mg=新的MatrixGrabber(); mg.getCurrentProjection(gl); mg.getCurrentModelView(gl); 无论我在何处放置相机,投影和模型视图矩阵都是相同的: 模型视图 1.0.0
MatrixGrabber mg=新的MatrixGrabber();
mg.getCurrentProjection(gl);
mg.getCurrentModelView(gl);
无论我在何处放置相机,投影和模型视图矩阵都是相同的:
模型视图
1.0.0.0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
投影
1.0.0.0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
一些代码:
私人游戏;
专用最终浮板尺寸=25f;
私人浮动[]eyeV;
私人浮动[]中心v;
私人浮动[]upV;
私人GL10 gl;
私有矩阵抓取器mg;
公营部门(){
游戏=新游戏();
eyeV=新浮点[]{boardSize/2f,boardSize/5f,boardSize*1.2f};
centerV=新浮点[]{boardSize/2f,boardSize/2f,0f};
upV=新浮点[]{0f,1f,0f};
mg=新矩阵抓取器();
}
已创建曲面上的公共void(GL10 gl、EGLConfig配置){
this.gl=gl;
gl.glHint(GL10.gl\u透视图\u校正\u提示,GL10.gl\u最快);
gl.glDisable(GL10.gl\u抖动);
gl.glEnable(GL10.gl_深度_试验);
gl.glEnable(GL10.gl_CULL_面);
gl.glCullFace(GL10.glu BACK);
gl.glShadeModel(GL10.glu平滑);
gl.glClearColor(.2f、.2f、.2f、1f);
gl.glClearDepthf(1f);
glEnable(GL10.Glu纹理2D);
游戏。加载纹理(gl);
}
公共框架(GL10 gl){
gl.glDisable(GL10.gl\u抖动);
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,eyeV[0],eyeV[1],eyeV[2],centerV[0],centerV[1],centerV[2],upV[0],upV[1],upV[2]);
游戏。平局(gl);
mg.getCurrentProjection(gl);
mg.getCurrentModelView(gl);
}
表面上的公共空隙已更改(GL10 gl,整型宽度,整型高度){
gl.glViewport(0,0,宽度,高度);
浮动比率=(浮动)宽度/(浮动)高度;
gl.glMatrixMode(GL10.gl_投影);
gl.glLoadIdentity();
gl.glFrustumf(-ratio,ratio,-1,1,1100);
}
谢谢你的建议 OpenGL上下文一次只在一个线程上运行,在android应用程序中,渲染器运行在单独的线程上。因此,如果您试图从主活动线程使用MatrixGrabber,它将无法获取矩阵。试着在onDrawFrame的末尾使用矩阵抓取器,看看你是否仍然得到了单位矩阵。