从OpenGL中的窗口触摸获取相应的3D对象坐标/顶点

时间:2013-11-25 13:38:13

标签: ios objective-c opengl-es 3d projection

我设置了一个OpenGL iOS项目。我读了很多关于GluUnproject的投影矩阵。我想动态地绘制3D模型。因此,我需要从窗口到3D对象的相应点。 从GluUnproject我得到了一个穿过我的3D场景的光线。之后我可以通过迭代算法(光线追踪)找到碰撞点......

现在出现问题:

  • 如何获得相应的纹理?
  • 如何获取相应的顶点/像素?
  • 如何在该透视纹理/像素上书写?

1 个答案:

答案 0 :(得分:1)

如何获得相应的纹理?

如果您使用基于对象的方法来处理场景中的对象,那么获取纹理应该很容易。只需在类中存储对纹理文件名的引用,然后在光线投射方法中迭代场景对象,在获得匹配时抓取纹理名称。

如何获得相应的顶点/像素?

如果您使用基于对象的方法进行对象绘制(即为场景中的每个对象实例化自定义对象类),这应该很容易。假设所有场景对象都在NSMutableArray中,您可以遍历数组,直到在光线照射对象上找到匹配项。

如何在该透视纹理/像素上书写?

如果您正在考虑在新纹理上书写文字,一种方法是使用UILabel图层作为纹理(例如,见下文),但如果您正在考虑在现有纹理上绘图,那么这很多更难(并且诚实地避免)。

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, height)];
    label.text = text;
    lLabel.font = [UIFont fontWithName:@"Helvetica" size:12];

    UIGraphicsBeginImageContext(standLabel.bounds.size);

    CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0, height);

    CGContextRef myContext = UIGraphicsGetCurrentContext();

    // flip transform used to transform the coordinate system from origin for OpenGL.
    CGAffineTransform flipTransform = CGAffineTransformConcat(CGAffineTransformMakeTranslation(0.f, height),
                                                              CGAffineTransformMakeScale(1.f, -1.f));
    CGContextConcatCTM(myContext, flipTransform);

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);

    [standLabel.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *layerImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();