如何在OpenGL ES1中跟踪纹理上的点



在我的iOS应用程序中,我有一个纹理应用到OpenGLES1渲染的球体上。用户可以旋转球体。我如何在任何给定时间跟踪纹理上的给定点在2D空间中的位置?

例如,在一个1000px x 1000px的纹理上给定点(200,200),我想在我的OpenGL视图顶部放置一个UIButton,当球体被操纵时跟踪这个点。

最好的方法是什么?

在我的第一次尝试中,我尝试使用一种颜色选择技术,在屏幕外的帧缓冲区中有一个单独的球体,在点(200,200)处使用黑色纹理和红色正方形。然后,我使用glReadPixels()来跟踪红色方块的位置,并相应地移动我的按钮。不幸的是,由于明显的性能原因,抓取所有像素数据并每秒迭代60次是不可能的。我尝试了许多方法来优化这个hack(例如:只迭代红色像素,每4个红色像素迭代一次,等等),但它就是不可靠。

我是一个OpenGL新手,所以我很感激任何指导。有没有更好的解决方案?谢谢!

我认为它更容易跟踪你的球在哪里,而不是用像素搜索它。然后有几个函数转换你的球的坐标到你的视图的坐标(和返回),然后设置你的子视图的中心转换坐标。

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;
}

这样你就不需要翻译任何东西了

相关内容

  • 没有找到相关文章

最新更新