在我的iOS应用程序中,我将纹理应用于在OpenGLES1中渲染的球体。球体可以由用户旋转。如何在任何给定时间跟踪纹理中给定点在2D空间中的位置?
例如,给定点(200,200)在1000px x 1000px的纹理上,我想在我的OpenGL视图上放置一个UIButton,跟踪该点,因为球体被操纵
最好的方法是什么?
在我的第一次尝试中,我尝试使用颜色拾取技术,其中我在屏幕外的帧缓冲区中使用单独的球体,该点使用黑色纹理,在点(200,200)处具有红色正方形。然后,我使用glReadPixels()
跟踪红色方块的位置,并相应地移动了我的按钮。不幸的是,由于显而易见的性能原因,抓取所有像素数据并每秒迭代60次是不可能的。我尝试了很多方法来优化这个黑客(例如:只迭代红色像素,迭代每第4个红色像素等),但它并没有被证明是可靠的。
我是一个OpenGL菜鸟,所以我很感激任何指导。有更好的解决方案吗?谢谢!
答案 0 :(得分:0)
我认为更容易跟踪你的球在哪里,而不是用像素搜索它。然后只需要几个函数将球的坐标转换为视图的坐标(和背面),然后将子视图的中心设置为平移坐标。
CGPoint translatePointFromGLCoordinatesToUIView(CGPoint coordinates, UIView *myGLView){
//if your drawing coordinates were between (horizontal {-1.0 -> 1.0} vertical {-1 -> 1})
CGFloat leftMostGLCoord = -1;
CGFloat rightMostGLCoord = 1;
CGFloat bottomMostGLCoord = -1;
CGFloat topMostGLCoord = 1;
CGPoint scale;
scale.x = (rightMostGLCoord - leftMostGLCoord) / myGLView.bounds.size.width;
scale.y = (topMostGLCoord - bottomMostGLCoord) / myGLView.bounds.size.height;
coordinates.x -= leftMostGLCoord;
coordinates.y -= bottomMostGLCoord;
CGPoint translatedPoint;
translatedPoint.x = coordinates.x / scale.x;
translatedPoint.y =coordinates.y / scale.y;
//flip y for iOS coordinates
translatedPoint.y = myGLView.bounds.size.height - translatedPoint.y;
return translatedPoint;
}
CGPoint translatePointFromUIViewToGLCoordinates(CGPoint pointInView, UIView *myGLView){
//if your drawing coordinates were between (horizontal {-1.0 -> 1.0} vertical {-1 -> 1})
CGFloat leftMostGLCoord = -1;
CGFloat rightMostGLCoord = 1;
CGFloat bottomMostGLCoord = -1;
CGFloat topMostGLCoord = 1;
CGPoint scale;
scale.x = (rightMostGLCoord - leftMostGLCoord) / myGLView.bounds.size.width;
scale.y = (topMostGLCoord - bottomMostGLCoord) / myGLView.bounds.size.height;
//flip y for iOS coordinates
pointInView.y = myGLView.bounds.size.height - pointInView.y;
CGPoint translatedPoint;
translatedPoint.x = leftMostGLCoord + (pointInView.x * scale.x);
translatedPoint.y = bottomMostGLCoord + (pointInView.y * scale.y);
return translatedPoint;
}
在我的应用程序中,我也选择使用iOS坐标系统。我只是将一个投影矩阵应用到我的整个glkView中,协调坐标系。
static GLKMatrix4 GLKMatrix4MakeIOSCoordsWithSize(CGSize screenSize){
GLKMatrix4 matrix4 = GLKMatrix4MakeScale(
2.0 / screenSize.width,
-2.0 / screenSize.height,
1.0);
matrix4 = GLKMatrix4Translate(matrix4,-screenSize.width / 2.0, -screenSize.height / 2.0, 0);
return matrix4;
}
这样您就不必翻译任何内容。