gpt4 book ai didi

c++ - OpenGL:标准化世界协调

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:06 24 4
gpt4 key购买 nike

我得到了更正后的屏幕坐标(左下角为 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——所以我们需要取消 near 和 far 投影)

此外,像这样检测 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);

问题出在这里:我可以得到World 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

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

最佳答案

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

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

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

关于c++ - OpenGL:标准化世界协调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9026425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com