在OpenGL中如何通过鼠标得到所点击点的三维坐标 通过确定视角 等信息后,如何通过鼠标点击 得到某点的三维坐标 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 gluUnProject。深度方向需要进一步通过基准面等方法确定。 http://community.csdn.net/Expert/topic/3146/3146805.xml?temp=.3910334 // 获取光标位置的模型坐标。 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;} #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); 是啊,本人很感激同志们,向你们致敬 :) 那太平洋 兄能给我发一份完整代码吗 :)[email protected] 这个代码比较少啊 :) 能简单解释一下吗?double Coor[3];这个就是最后返回的三维点坐标最后一行错了,是 gluUnProject(X, View[3]-Y-1, depth, Model, Proj, View, Coor, Coor+1, Coor+2);呵呵,不好意思大概流程就是先获得深度平面,然后定位具体坐标位置 我帖子上的代码已经很完整了,我再给你一些地址,上面有解释和更多的代码:http://community.csdn.net/Expert/topic/3146/3146805.xml?temp=.948559http://community.csdn.net/Expert/topic/3115/3115928.xml?temp=.6338007http://community.csdn.net/Expert/topic/3143/3143497.xml?temp=.9614374 主程序没启动,ActiveX控件就生成了! 使用EnumPrinters函数得到的打印机名和打印服务器名为什么数字? 五叉了,不容易,散点分! 紧急!寻求开发棋牌游戏高手合作一个项目!!! ATL 写office 插件时, 为什么反注册时会出错说 CComboBox输入字符的问题 关于UpdateData函数 怎样删除类?怎样取消与对话框的关联? 我知道如何连接SQL,但使用ADO如何连接DBF? 是我弄错了吗? 关于 VC 的一个长期 大惑不解的问题? 请进! vc操作office问题!
深度方向需要进一步通过基准面等方法确定。
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;
}
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);
[email protected]
double Coor[3];
这个就是最后返回的三维点坐标
最后一行错了,是
gluUnProject(X, View[3]-Y-1, depth, Model, Proj, View, Coor, Coor+1, Coor+2);
呵呵,不好意思大概流程就是先获得深度平面,然后定位具体坐标位置
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