gpt4 book ai didi

opengl - gluUnProject() 的世界坐标问题

转载 作者:行者123 更新时间:2023-12-02 05:50:39 26 4
gpt4 key购买 nike

我当前正在从游戏循环中调用 Trace(下面的方法)。现在我想做的就是从屏幕鼠标获取世界坐标,这样我就可以在世界空间中移动对象。然而,我从 gluUnProject 得到的值是;让我很困惑。

我使用 glReadPixel(...) 来获取 Z 值,但这对我正在绘制的对象几乎没有产生任何移动,并且生成的矢量最终与我的相机位置相同(除了微小的小数变化)由于鼠标移动),所以我决定摆脱调用并将 Z 值替换为 1。

我的问题是:下面的代码对您来说合适吗?到目前为止,我看到的每个例子要么相同,要么非常相似,但即使我锁定 Y 轴,我似乎也无法产生正确的结果。如果代码是正确的,那么我猜测我只是没有正确使用生成的向量。我是否应该无法直接使用结果向量绘制对象或点,或者我是否必须对其执行其他操作,例如标准化?

当前渲染模式是 GL_RENDER,我使用 glFrustum(NearZ 值为 1,FarZ 值为 2048)来创建透视图。还有一系列用剪刀创建的视口(viewport),尺寸和宽度为 512x768,位于 1024x768 窗口的每个角落。 Trace(...) 在左上视口(viewport)的渲染之间被调用,并且是唯一的透视投影,而其他视口(viewport)是正交的。 FOV 设置为 45。

void VideoWindow::Trace(int cursorX, int cursorY)
{
double objX, objY, objZ;//holder for world coordinates
GLint view[4];//viewport dimensions+pos
GLdouble p[16];//projection matrix
GLdouble m[16];//modelview matrix
GLdouble z;//Z-Buffer Value?

glGetDoublev (GL_MODELVIEW_MATRIX, m);
glGetDoublev (GL_PROJECTION_MATRIX,p);
glGetIntegerv( GL_VIEWPORT, view );

//view[3]-cursorY = conversion from upper left (0,0) to lower left (0,0)
//Unproject 2D Screen coordinates into wonderful world coordinates
gluUnProject(cursorX, view[3]-cursorY, 1, m, p, view, &objX, &objY, &objZ);

//Do something useful here???
}

有什么想法吗?

编辑:我已将 winZ 值更改为 0.5 而不是 1,这给出了更合理的向量,但绘制点仍然与鼠标不匹配。我发现 view[3] 的值为 384,这对于我正在使用的视口(viewport)来说是正确的,但我将其替换为 768(实际窗口大小),并且该点 100% 跟随鼠标。进一步的实验表明,我无法使用这些坐标在透视世界空间中围绕 3D 对象移动,但是使用这些坐标在正交空间中围绕 3D 对象移动效果很好。

最佳答案

winz gluUnproject 的参数指定您“拾取”点的相机深度。正如您所说,这个坐标应该在 [0, 1] 范围内。

一些tutorials像 NeHes 一样,从深度缓冲区中读出 z 坐标,以便您在正确的深度“拾取”,当然,要使其工作,您必须在渲染完其他所有内容后执行 gluUnproject。

无论如何,如果您设置 winz为 0.5 或其他值(不是 0 或 1,否则该点将最终位于近剪裁平面或远剪裁平面上,并且可能被剔除)并执行以下操作:

gluUnProject(cursorX, view[3]-cursorY, 0.5, m, p, view, &objX, &objY, &objZ);
//Do something useful here???
glPointSize(10);
glBegin(GL_POINTS);
glColor3f(1, 0, 0);
glVertex3f(objX, objY, objZ);
glEnd();

您最终应该在鼠标指针处看到一个红色 Blob (前提是之后没有其他任何东西过度绘制它,并且您没有任何有趣的渲染状态使该点不可见)。

关于opengl - gluUnProject() 的世界坐标问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1834648/

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