在OpenGL中如何通过鼠标得到所点击点的三维坐标

susanyw 2004-07-08 08:01:27
通过确定视角 等信息后,如何通过鼠标点击 得到某点的三维坐标
...全文
1472 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
alphapaopao 2004-08-31
  • 打赏
  • 举报
回复
呵呵
syy64 2004-08-30
  • 打赏
  • 举报
回复
哥们,还不结帖呀,可得讲信誉呀。
kathywp 2004-07-15
  • 打赏
  • 举报
回复
这个代码比较少啊 :) 能简单解释一下吗?
double Coor[3];
这个就是最后返回的三维点坐标
最后一行错了,是
gluUnProject(X, View[3]-Y-1, depth, Model, Proj, View, Coor, Coor+1, Coor+2);
呵呵,不好意思

大概流程就是先获得深度平面,然后定位具体坐标位置
susanyw 2004-07-15
  • 打赏
  • 举报
回复
是啊,本人很感激同志们,向你们致敬 :) 那太平洋 兄能给我发一份完整代码吗 :)
houk352@nenu.edu.cn
syy64 2004-07-15
  • 打赏
  • 举报
回复
我帖子上的代码已经很完整了,我再给你一些地址,上面有解释和更多的代码:
http://community.csdn.net/Expert/topic/3146/3146805.xml?temp=.948559
http://community.csdn.net/Expert/topic/3115/3115928.xml?temp=.6338007
http://community.csdn.net/Expert/topic/3143/3143497.xml?temp=.9614374
susanyw 2004-07-14
  • 打赏
  • 举报
回复
这个代码比较少啊 :) 能简单解释一下吗?
kathywp 2004-07-14
  • 打赏
  • 举报
回复
#include <gl\glu.h>
double Model[16],Proj[16];
int View[4];

glGetDoublev(GL_MODELVIEW_MATRIX,Model);
glGetDoublev(GL_PROJECTION_MATRIX,Proj);
glGetIntegerv(GL_VIEWPORT,View);

float depth = 0.0;
//读取深度信息
glReadPixels(X, View[3]-Y-1, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

double Coor[3]; // 返回值
gluUnProject(X, View[3]-Y-1, depth, Model, Proj, View, Coor, Coor+1, Coor+1);
syy64 2004-07-14
  • 打赏
  • 举报
回复
我的代码可是通过验证的。
viviyw 2004-07-13
  • 打赏
  • 举报
回复
up!
snowegale888 2004-07-10
  • 打赏
  • 举报
回复
up
hmsxg4160 2004-07-09
  • 打赏
  • 举报
回复
看看论文:一种平行透视下的三维拾取方法
2002年2月第32卷第1期
西北大学学报(自然科学版)J
hmsxg4160 2004-07-09
  • 打赏
  • 举报
回复
场景中物体在世界坐标系,屏幕显示为局部二维坐标系,首先要变换世界坐标系到局部二维坐标系,将鼠标点击的点作为垂直屏幕的一条射线,与物体相交就可以得到三维坐标
syy64 2004-07-09
  • 打赏
  • 举报
回复
// 获取光标位置的模型坐标。 2002.11.18.
CVector3 WINAPI GetMouseModelCoordinate(CVRRoomView* pView, CPoint point)
{
GLfloat fdepth;
GLdouble ObjectX, ObjectY, ObjectZ;
GLint iViewPort[4];
GLdouble dProjMatrix[16];
GLdouble dModelMatrix[16];
POINT iScreen;
int iScrToWinX, iScrToWinY;
long iError;
CVector3 pp;

CClientDC ClientDC(pView);
wglMakeCurrent(ClientDC.m_hDC, pView->m_hGLContext); //使 RC 与当前 DC 相关联
glGetIntegerv(GL_VIEWPORT, iViewPort);
glPushMatrix();
glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);
::GetCursorPos(&iScreen);
iScrToWinX = iScreen.x-point.x;
iScrToWinY = iScreen.y-point.y;
glReadPixels(point.x, iViewPort[3]-point.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &fdepth);
gluUnProject((GLdouble)point.x, (GLdouble)(iViewPort[3]-point.y), (GLdouble)fdepth, dModelMatrix, dProjMatrix, iViewPort, &ObjectX, &ObjectY, &ObjectZ);
if(ObjectX>=pView->m_pDoc->m_dModelMinX&&ObjectX<=pView->m_pDoc->m_dModelMaxX&&
ObjectY>=pView->m_pDoc->m_dModelMinY&&ObjectY<=pView->m_pDoc->m_dModelMaxY&&
ObjectZ>=pView->m_pDoc->m_dModelMinZ&&ObjectZ<=pView->m_pDoc->m_dModelMaxZ)
{
pp.x = ObjectX;
pp.y = ObjectY;
pp.z = ObjectZ;
}
else
{
pp.x = pView->m_pDoc->m_pRoamParameter->dMouseModelX;
pp.y = pView->m_pDoc->m_pRoamParameter->dMouseModelY;
pp.z = pView->m_pDoc->m_pRoamParameter->dMouseModelZ;
}
// pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectX;
// pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectY;
// pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectZ;
glPopMatrix();
iError = glGetError();
if(iError!=GL_NO_ERROR)
{
// Errinfo = gluErrorString(iResultCode);
::MessageBox(NULL, (LPCTSTR)gluErrorString(iError), "提示13:", MB_OK);
}
wglMakeCurrent(ClientDC.m_hDC, NULL);//释放 RC,以便其它 DC 进行绘图
return pp;
}
syy64 2004-07-09
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3146/3146805.xml?temp=.3910334
alphapaopao 2004-07-09
  • 打赏
  • 举报
回复
gluUnProject。
深度方向需要进一步通过基准面等方法确定。

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧