在我的游戏中,我需要找出玩家所触摸的位置。 MotionEvent.getX()和MotionEvent.getY()返回窗口坐标。所以我做了这个函数来测试将窗口坐标转换成OpenGL坐标:
public void ConvertCoordinates(GL10 gl) {
float location[] = new float[4];
final MatrixGrabber mg = new MatrixGrabber(); //From the SpriteText demo in the samples.
mg.getCurrentProjection(gl);
mg.getCurrentModelView(gl);
int viewport[] = {0,0,WinWidth,WinHeight};
GLU.gluUnProject((float) WinWidth/2, (float) WinHeight/2, (float) 0, mg.mModelView, 0, mg.mProjection, 0, viewport, 0, location,0);
Log.d("Location",location[1]+", "+location[2]+", "+location[3]+"");
}
X和y从几乎-33到几乎+33振荡。 Z通常是10.我使用MatrixGrabber是错误的吗?
答案 0 :(得分:1)
对我而言,最简单的方法是将屏幕上的点击想象为从相机位置开始并进入无限远的光线
为了得到那条光线,我需要在至少2个Z位置(在视线中)询问它的世界坐标。
这是我查找光线的方法(取自我猜的相同的Android演示应用程序)。 它在我的应用程序中运行良好:
public void Select(float x, float y) {
MatrixGrabber mg = new MatrixGrabber();
int viewport[] = { 0, 0, _renderer.width, _renderer.height };
_renderer.gl.glMatrixMode(GL10.GL_MODELVIEW);
_renderer.gl.glLoadIdentity();
// We need to apply our camera transformations before getting the ray coords
// (ModelView matrix should only contain camera transformations)
mEngine.mCamera.SetView(_renderer.gl);
mg.getCurrentProjection(_renderer.gl);
mg.getCurrentModelView(_renderer.gl);
float realY = ((float) (_renderer.height) - y);
float nearCoords[] = { 0.0f, 0.0f, 0.0f };
float farCoords[] = { 0.0f, 0.0f, 0.0f };
gluUnProject(x, realY, 0.0f, mg.mModelView, 0, mg.mProjection, 0,
viewport, 0, nearCoords, 0);
gluUnProject(x, realY, 1.0f, mg.mModelView, 0, mg.mProjection, 0,
viewport, 0, farCoords, 0);
mEngine.RespondToClickRay(nearCoords, farCoords);
}
在OGL10 AFAIK中,您无法访问Z-Buffer,因此您无法在屏幕x,y坐标处找到最近对象的Z. 您需要自己计算射线击中的第一个物体。
答案 1 :(得分:1)
您的错误来自输出数组的大小。它们需要长度4而不是3,如上面的代码所示。