【问题标题】:OpenGL: normalizing world coordinationOpenGL:标准化世界协调
【发布时间】:2012-02-20 00:52:55
【问题描述】:

我得到了更正的屏幕坐标(左下角的 0,0):

GLint realy;
realy = winHeight - (GLint) y - 1;
screen.x = (float)x;
screen.y = (float)realy;

然后我在 zNear 和 zFar 获得世界:

worldNear = glm::unProject(glm::vec3(screen.x, screen.y, 0.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));
worldFar = glm::unProject(glm::vec3(screen.x, screen.y, 1.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));

但我这样设置透视投影,所以我知道 zFar 和 zNear,我不确定是否需要上述代码: glm::perspective(fovy, 1.0f * winWidth/winHeight, zNear, zFar); (我们需要通过 X、Y、Z 获得 zNear 和 zFar——所以我们需要取消投影近处和远处)

另外,像这样检测 Zdepth 缓冲区:

GLfloat depth;
glReadPixels(screen.x, screen.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

和像这样的像素颜色:

GLubyte pixel[3];
glReadBuffer( GL_BACK );
glReadPixels(screen.x, screen.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void *)pixel);

问题来了:我可以得到世界X,Y,Z,但是我需要标准化坐标,所以我可以通过鼠标平滑移动物体,如何?

glm::vec4 normalizePoint = ** ??? **
world.x = normalizePoint.x;
world.y = normalizePoint.y;
world.z = normalizePoint.z;

(目前我的世界坐标要么太远要么太近,这就是问题所在)

编辑:我在这里找到第一个问题的答案:

iPhone OpenGL : Using gluUnProject (port) and detecting clicking on an object

我需要射线-物体碰撞,现在可以了!!

【问题讨论】:

  • 标准化是什么意思?通常是指将向量除以标量以将其置于标准形式(通常是单位长度)。您的代码看起来不错,但我质疑您为什么要读取后台缓冲区和 z 缓冲区,而您可以直接与您的世界位置进行光线对象碰撞。
  • 问题是我们不明白您的要求或您想要做什么。例如,您对“规范化”等术语的使用是非标准且令人困惑的。

标签: c++ opengl


【解决方案1】:

将您在屏幕空间中用于移动的 2D 矢量(例如 (20,0) 向右 20 像素)投影到与您正在移动的对象相同深度的世界空间中。

通过您的视图和投影矩阵将对象位置投影到屏幕空间中,可以找到与对象“相同的深度”。

glm::vec3 addThisToYourObjectPosition = glm::unProject(glm::vec3(screenMove.x, screenMove.y, objectProjectedZ), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多