Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL:模型视图和投影矩阵_Android_Opengl Es_Projection Matrix - Fatal编程技术网

Android OpenGL:模型视图和投影矩阵

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

我想使用gluUnProject进行三维拾取。它返回错误的值。我认为原因是ModelView和投影矩阵生成不正确。为了获取它们,我使用API演示中的MatrixGrabber、MatrixStack和MatrixTrackingGL类:

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的末尾使用矩阵抓取器,看看你是否仍然得到了单位矩阵。