【问题标题】:GLKMathProject : Plotting a UIView based on OpenGl CorrdsGLK 数学项目:绘制基于 OpenGL 坐标的 UIView
【发布时间】:2014-05-05 20:23:52
【问题描述】:

我已经使用 GLKMathUnProject 来实现光线拾取,这样我就可以触摸 3D 空间中的对象。现在我想做的是(例如)在该对象上方显示一个标签。所以我需要将 3D 空间转换为 2D 屏幕线(我知道使用 OpenGl 和 UIKit 是一个坏主意,并且已经实现了文本到纹理)。

我在下面使用了以下方法,但是我认为我遗漏了一些东西。我在 iPad 上,该项目在我面前,老实说不知道如何处理 z。:
{922.111, 763.055, 0.990884}

 GLKVector3 x = GLKMathProject(building.position, _baseModelViewMatrix, _projectionMatrix, viewport);

  NSLog(@"%@", NSStringFromGLKVector3(x));

  UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x.x, x.y, 50, 20)];
  label.text = @"TEST";
  [self.view addSubview:label];

【问题讨论】:

  • 有什么问题?对于视网膜显示器,您可能需要将这些坐标除以 2.0。 Z坐标对您的情况没用。顺便说一句,混合 OpenGL 和 UIKit 绝非坏主意。
  • 哦,好吧,它是视网膜,可以在 3d 上方显示标签,例如名称和东西(动态)发短信似乎有点过头了
  • 请在修复后作为解决方案发布

标签: ios opengl-es-2.0 glkit


【解决方案1】:

您获得的结果向量取决于视口坐标系,而不是您的视图坐标系。一般来说,X 和 Y 必须除以视口宽度和高度,然后乘以视图宽度和高度。在您的情况下,由于视网膜显示,这是除以 2。

至于 Z 坐标,您不需要它来表示位置,但您可以将它用于 Z 顺序。例如,如果您将有多个文本标签,您可以按 Z 值对它们进行排序,因此后面的那些将留在后面,如果其中 2 个在相同的屏幕位置,则正确的一个将在前面。你也可以使用这个值来缩小一些远标签。

至于将 UIKit 与 OpenGL 混合使用应该没有问题,而且这不是一个坏习惯。尽管您不能混合深度缓冲区,但您应该注意:您将无法在某些标签前绘制某些 OpenGL 绘制的对象。 如果最终您确实选择在 OpenGL 中绘制标签,我建议从 UIView(或标签)创建图像并将其用作纹理,而不是尝试找到一些用于文本绘制的库。通过这样做,您将能够使用所有已经完成的工具,例如字体、颜色、换行...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多