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数据非常的大 都是上千万的数据。得不到准确的数据。
我程序里用过许多变换 是不是这些的问题?
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 通过射线鼠标拾取怎么都得不到准确数据的主要内容,如果未能解决你的问题,请参考以下文章