我正在使用 OpenGL 绘制地图。在读取 XML 文件并设置相应的缓冲区后,我正在绘制地图。这张地图包含街道、高速公路和边界。我想要的是每当我触摸地图时,应该更改特定图层的颜色。
我面临的问题是,每当我触摸屏幕时,我都会得到我触摸点的屏幕像素。我想将此点转换为 OpenGL 坐标,以便我可以将此点与绘制的地图匹配并突出显示所选点。
如何将此点转换为OpenGL坐标?
我正在使用 OpenGL 绘制地图。在读取 XML 文件并设置相应的缓冲区后,我正在绘制地图。这张地图包含街道、高速公路和边界。我想要的是每当我触摸地图时,应该更改特定图层的颜色。
我面临的问题是,每当我触摸屏幕时,我都会得到我触摸点的屏幕像素。我想将此点转换为 OpenGL 坐标,以便我可以将此点与绘制的地图匹配并突出显示所选点。
如何将此点转换为OpenGL坐标?
您需要将屏幕点取消投影到 OpenGL 世界空间中:
vec3 UnProjectPoint( const vec3& Point, const max4& Projection, const mat4& ModelView )
{
vec4 R( Point, 1.0f );
R.x = 2.0f * R.x - 1.0f;
R.y = 2.0f * R.y - 1.0f;
R.y = -R.y;
R.z = 1.0f;
R = Projection.GetInversed() * R;
R = ModelView.GetInversed() * R;
return R.ToVec3();
}
您可以使用转换矩阵和您的相机位置将屏幕坐标转换为 opengl。请参阅:https ://stackoverflow.com/a/11716990/1369222
更好地覆盖 GLSurfaceView 类的 onTouchEvent(MotionEvent e) 并在 onSurfaceChanged(GL10 gl, int width, int height) 方法的 Renderer 类中使用下面的代码。
GLU.gluOrtho2D(gl,0,width,0,height);
上面的代码会将屏幕坐标映射到 openGL SurfaceView 屏幕,您可以轻松地将点放在屏幕上。但这只会出现在 2D 视图中。