目前,我正在使用 OpenGL ES 2.0 绘制一个带有引脚的对象,并将其显示在 CAEAGLLayer 上。我能够通过颜色挑选来识别物体。现在我需要计算 pin 的世界坐标的屏幕坐标,以便在正确的位置绘制例如标签(我想使用可可触摸组件)。计算屏幕坐标的正确方法是什么(应该忽略隐藏的对象)?遍历整个图像并使用每个像素对其执行颜色选择听起来不是正确的方法。
提前致谢。
目前,我正在使用 OpenGL ES 2.0 绘制一个带有引脚的对象,并将其显示在 CAEAGLLayer 上。我能够通过颜色挑选来识别物体。现在我需要计算 pin 的世界坐标的屏幕坐标,以便在正确的位置绘制例如标签(我想使用可可触摸组件)。计算屏幕坐标的正确方法是什么(应该忽略隐藏的对象)?遍历整个图像并使用每个像素对其执行颜色选择听起来不是正确的方法。
提前致谢。
Apple 提供了自己的 GL 数学函数:请参阅GLKMathUtils 文档。
正如 Lukas 指出的那样,您可以使用它来投影(世界 -> 屏幕坐标)或取消投影(屏幕 -> 世界坐标)
因此,如果您已经在使用 GLKit 进行矩阵转换,则可以使用:
GLKVector3 screenPoint = GLKMathProject(modelPoint, modelViewMatrix, projectionMatrix, viewport);
我可以自己回答这个问题。在某些版本的 OpenGL 中 glProject() 可用,可用于计算屏幕上顶点的位置。不幸的是,此函数在 OpenGL ES 2.0 中不可用,因此您必须自己进行计算,或者使用诸如OpenGL 数学之类的数学库,它提供了一个函数 glProject():
#include "matrix_transform.hpp"
#include "transform.hpp"
vec3 pinScreenPosition = glm::project(vec3(0,0,0), modelMatrix, projectionMatrix, vec4(0, 0, screenDimensions.x * screenScale, screenDimensions.y * screenScale));