opengl 通过射线鼠标拾取怎么都得不到准确数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl 通过射线鼠标拾取怎么都得不到准确数据相关的知识,希望对你有一定的参考价值。

我的程序是这样的。
GLdouble objx,objy,objz;
GLdouble ModelMatrix[16], ProjMatrix[16];

glGetIntegerv(GL_VIEWPORT, Viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, ModelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, ProjMatrix);

winX = (GLdouble)xPos -145;
winY =81 + (GLdouble)Viewport[3] - (GLdouble)yPos;

gluUnProject(winX, winY, 0.0, ModelMatrix, ProjMatrix, Viewport, &objx, &objy, &objz);
nearPoint.x = objx;
nearPoint.y = objy;
nearPoint.z = objz;

由于我的程序opengl视口是在MFC cstatic控件上画的 winX winY 调试都没问题 但是gluUnProject后得到的obj数据非常的大 都是上千万的数据。得不到准确的数据。

我程序里用过许多变换 是不是这些的问题?

参考技术A 我的程序里的变换
glLoadIdentity();
gluLookAt(eyes.x,eyes.y,eyes.z,
posing.x,posing.y,posing.z,
0,0.1,0
);
glRotatef(pitch,sin(-45),0.0f,cos(24.58));
glRotatef(-angle,0.0f,1.0f,0.0f);本回答被提问者采纳
参考技术B winX = (GLdouble)xPos -145;
winY =81 + (GLdouble)Viewport[3] - (GLdouble)yPos;
glReadPixels(int(winY), int(winY),1,1,GL_DEPTH_COMPONENT,GL_FLOAT, &winZ);
gluUnProject
参考技术C lalala

OpenGL 3D拾取文章(转)

参考文章

深入探索3D拾取技术

OpenGL 3D拾取

射线和三角形的相交检测(ray triangle intersection test)

3D拾取的方法有两种

1、基于几何计算的射线-三角形相交法

2、使用OpenGL本身的拾取机制

这里主要使用第二种,理解起来相对简单一点。

借用大佬的通俗易懂的说法,这种方法的本质就是:

把每个三角形的id作为材质渲染到屏幕上,很容易就能找到鼠标对应的颜色值。这样多少三角形都能正确得到。 完全不用进行数学计算。

优点在于减少了大量不必要的计算开销——只对所有最终接受的模型进行判断。并且实际判断逻辑相对简单。

但缺点是需要一块额外的渲染表面用于渲染ID+深度数据,对于某些受限比较严格的设备可能有内存压力。

具体操作:待实现...

以上是关于opengl 通过射线鼠标拾取怎么都得不到准确数据的主要内容,如果未能解决你的问题,请参考以下文章

Opengl:尝试绘制线条以可视化鼠标射线投射时出现意外行为

OpenGL 中的射线球相交

OpenGL画好的线条,怎么用鼠标拾取

OpenGLES—拾取

WebGL模型拾取——射线法

OpenGL鼠标拾取操作glRenderMode一直返回0