- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我当前正在从游戏循环中调用 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/
在this线。第二个答案表明: Solution 2 call the gluUnproject two time, one with clipZ = -1 and another one with
我正在使用 gluUnProject 将光线转换到场景中并在其中添加基元。我现在要做的是准确地选择现有的图元,因此如果我有 3 个球体,我可以单击其中一个将其删除。 我认为解决方案会以某种方式检查光线
我当前正在从游戏循环中调用 Trace(下面的方法)。现在我想做的就是从屏幕鼠标获取世界坐标,这样我就可以在世界空间中移动对象。然而,我从 gluUnProject 得到的值是;让我很困惑。 我使用
我需要 gluUnProject 将屏幕坐标转换为世界坐标,现在我正要让它工作。当我的应用程序运行时,它准确地告诉我屏幕上的坐标,我知道这些坐标存储在我的渲染器线程中,然后抽出屏幕坐标。不幸的是,屏幕
我正在做一个 OpenGL 项目,我需要能够在 3D 空间中点击东西。据我所知, gluUnproject() 将完成这项工作。但是我听说可能会发生意想不到的事情,并且准确性会下降。可能只是这些人用错
我正在尝试使用 gluUnProject 将我的鼠标坐标转换为世界坐标,但它似乎不起作用,或者我只是误解了 glUnProject 函数的功能,这是我正在使用的代码,我的矩阵都是检查结果很好,至于鼠标
我正在将 SDL 与 OpenGL 一起使用,到目前为止,我已经完成了 2d 中的所有操作(使用 glOrtho()) 现在我想尝试在 3D 中绘制东西,但是当然,因为我现在已经将第三维加入到混合物中
我正在绘制一个 z=0 的纹理,如下图所示: 我的近平面和远平面设置为 0.001 和 120.0。我可以使用键盘四处移动并放大和缩小。 我想要的是在使用 gluunproject 时识别鼠标光标位置
大家好,我在这里阅读了很多关于如何使用 gluUnproject 的文章,我认为我基本上了解了它的作用。但是,是的,我的问题是这个.. 我有 1 架飞机,如果我点击那里没有问题,我的对象会去那里,但如
我正在尝试从鼠标点击屏幕到 3D 空间跟踪光线。据我了解,默认位置和方向如下所示: 来自这段代码: GLint viewport[4]; GLdouble modelview[16];
我正在移植 GLU gluUnproject现代OpenGL的方法。我大致了解它背后的算法,但我的问题是为什么我们需要模型 View 矩阵?它可以只是 View 矩阵吗?我们将屏幕坐标投影到世界空间中
我正在尝试使用 glReadPixels 和 gluUnProject 获取真实坐标,但它不起作用。 void GLWidget::resizeGL(int Width, int Height) {
我尝试将鼠标点击坐标转换为 opengl 坐标。实际上它似乎有效,但是当我取消注释我刚刚为测试而编写的 cout 行时,它会将我的 vars 设置为不是数字 -nan。它是如何发生的?我该如何解决?
我有一个由很多点组成的场景,我用它绘制了 glBegin(GL_POINTS); glVertex3f(x[i],y[i],z[i]); // the points are displayed pro
我收到此错误消息 08-30 19:20:17.774: ERROR/AndroidRuntime(4681): FATAL EXCEPTION: GLThread 9 08-30 19:20:17.
在不使用 gluUnProject 的情况下,如何在现代 OpenGL 中将屏幕坐标转换为世界坐标? 最佳答案 AFAIK - gluUnproject 需要提供给它的所有信息(模型 View 、投影
我有一个场景,我正在用 openGL 在其中渲染几个立方体(程序结构没有使用 GLUT,它在 win32 程序结构中,但我只是用 glutSolidCube 绘制立方体)现在我想通过鼠标选择这些立方体
我这样设置我的场景(Android 应用程序,OpenGL ES): GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f); // ... GLU.
通过iOS的2D屏幕坐标来检测3D世界坐标,除了gluUnProject端口还有没有其他可能的方法? 这几天我一直在摆弄这个问题,但我似乎无法掌握它的窍门。 -(void)receivePoint:(
我正在尝试使用鼠标在 3D 空间中移动 3D 对象。 因此,我检索实际矩阵并使用 gluUnProject(将窗口坐标映射到对象坐标)从鼠标位置 dx 和 dy 获取实际的 x、y、z。 根据设计,我
我是一名优秀的程序员,十分优秀!