VC++OpenGL 鼠标点击屏幕获取三维模型的三维坐标

little_angel 2011-06-05 10:05:42
我用VC++OpenGL实现了读取文件显示出三维网格模型。
现在我想实现: 鼠标点击屏幕上的一个点,从而获取该点在三维模型上的三维坐标。
大家帮帮我,谢谢了。
...全文
863 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 j123kaishichufa 的回复:]

引用 14 楼 bhybhybhy2 的回复:
忘记当时怎么考虑的了 计算误差?


四舍五入,是把。(结果是整形)。

gluUnProject(i_ScreenPtX, (GLdouble)realy, 1, mvmatrix, projmatrix, viewport,
&dX, &dY, &dZ);
gluUnProject(i_ScreenPtX……
[/Quote]差别大 是因为你的视景体大 2个点是与市井体的边界面(不是实体)交点 根据这2个点可以形成射线 求与实体的交线
射线也可以由点与方向计算 ,方向怎么算我忘了
little_angel 2011-06-13
  • 打赏
  • 举报
回复
找到的点有的准确 有的不准确,为什么啊?我的射线是由gluUnProject()得到的两个点确定的。。
little_angel 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bhybhybhy2 的回复:]
引用 15 楼 j123kaishichufa 的回复:

引用 14 楼 bhybhybhy2 的回复:
忘记当时怎么考虑的了 计算误差?


四舍五入,是把。(结果是整形)。

gluUnProject(i_ScreenPtX, (GLdouble)realy, 1, mvmatrix, projmatrix, viewport,
&dX, &……
[/Quote]

我就这样做,射线法和模型求交。 程序昨晚刚搞定。但是程序有两个问题: 一是:有时候点击得到的点位置准确,有的点击得到的点位置很不准确。 二是:有时候点击的点就没有找到射线和模型的哪个三角形相交?好奇怪...
现在就是调程序 找问题了。。唉..
  • 打赏
  • 举报
回复
man man lai, w computer huai le
little_angel 2011-06-12
  • 打赏
  • 举报
回复
bhybhybhy2 我的QQ号是:290141652,加一下你为好友,可以不?QQ交流方便些。呵呵。如果可以的话,就加我QQ吧,呵呵..
little_angel 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bhybhybhy2 的回复:]
忘记当时怎么考虑的了 计算误差?
[/Quote]

四舍五入,是把。(结果是整形)。

gluUnProject(i_ScreenPtX, (GLdouble)realy, 1, mvmatrix, projmatrix, viewport,
&dX, &dY, &dZ);
gluUnProject(i_ScreenPtX, (GLdouble)realy, 0, mvmatrix, projmatrix, viewport,
&dX, &dY, &dZ) ;

我试验了一下,得到的两个坐标,差别很大。一个坐标数据和模型本身数据接近是
(-15.09,84.97,505.8297),,而另一个坐标值就很小是(-0.4579 -2.4508,-1.95),.这差别不会太大了啊???这两个坐标和元模型的数据是不是统一的。我直接用这个坐标所在的直线 和原模型碰撞,看这条直线和原模型的的那个三角形面片相交。。这样行吗?
  • 打赏
  • 举报
回复
忘记当时怎么考虑的了 计算误差?
little_angel 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bhybhybhy2 的回复:]
STDMETHODIMP CView_View::ScreenPtToViewPt(double i_ScreenPtX,double i_ScreenPtY,double* o_ViewPointX,double* o_ViewPointY,double* o_ViewPointZ,double* o_FrontViewPointX,double* o_FrontViewPointY,doubl……
[/Quote]

realy=viewport[3]-i_ScreenPtY-1;

这一句 为什么是realy=viewport[3]-i_ScreenPtY-1;
而不是realy=viewport[3]-i_ScreenPtY;
.
  • 打赏
  • 举报
回复

void CAsmView::OnLButtonUp(UINT nFlags, CPoint point)
{
double dx,dy,dz,Frontdx,Frontdy,Frontdz;
ASSERT( m_pV3dView != NULL );
::wglMakeCurrent(m_hDC,m_hRC);
double idx = point.x;
double idy = point.y;
m_pV3dView->ScreenPtToViewPt(idx,idy,&dx,&dy,&dz,&Frontdx,&Frontdy,&Frontdz);
::wglMakeCurrent(NULL,NULL);

.........
}
  • 打赏
  • 举报
回复
STDMETHODIMP CView_View::ScreenPtToViewPt(double i_ScreenPtX,double i_ScreenPtY,double* o_ViewPointX,double* o_ViewPointY,double* o_ViewPointZ,double* o_FrontViewPointX,double* o_FrontViewPointY,double* o_FrontViewPointZ)
{

glPushMatrix();

glRotatef(m_dRotX, 1.0f, 0.0f, 0.0f);
glRotatef(m_dRotY, 0.0f, 1.0f, 0.0f);
glRotatef(m_dRotZ, 0.0f, 0.0f, 1.0f);


GLdouble mvmatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);

GLdouble projmatrix[16];
glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport);
double realy;
realy=viewport[3]-i_ScreenPtY-1;

double dX , dY , dZ ;
dX = dY = dZ = 0;
gluUnProject(i_ScreenPtX, (GLdouble)realy, 1, mvmatrix, projmatrix, viewport,
&dX, &dY, &dZ);


*o_ViewPointX = dX;
*o_ViewPointY = dY;
*o_ViewPointZ = dZ;
gluUnProject(i_ScreenPtX, (GLdouble)realy, 0, mvmatrix, projmatrix, viewport,
&dX, &dY, &dZ) ;

*o_FrontViewPointX = dX;
*o_FrontViewPointY = dY;
*o_FrontViewPointZ = dZ;

glPopMatrix();


return S_OK;
}
  • 打赏
  • 举报
回复
好像得到一个交点, 方向 0, 0, 1 的射线也可以
  • 打赏
  • 举报
回复
GLdouble winz 取0 取 1 得到与实景体的2ge交点
little_angel 2011-06-05
  • 打赏
  • 举报
回复
还有 就是
“要看鼠标是否选中三维实体, 可以根据2点(gluUnProject可以得到视景体的前后面2个交点) 作射线,求射线和实体是否交点”

gluUnProject可以得到视景体的前后面2个交点??怎么得到两个?
int APIENTRY gluUnProject (
GLdouble winx,
GLdouble winy,
GLdouble winz,
const GLdouble modelMatrix[16],
const GLdouble projMatrix[16],
const GLint viewport[4],
GLdouble *objx,
GLdouble *objy,
GLdouble *objz);

winx winy winz确定后只能得到一个三维坐标的。难道你是说调用GluUnproject两次。。
但是一个鼠标点只对应一个(WinX,winy,winz)。。请问怎么会得到两个三维坐标点?
little_angel 2011-06-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bhybhybhy2 的回复:]

三维实体的坐标系统使用的是局部坐标系 当然不同意, 不经处理(从世界到局部转化)就是统一的,看你的情况是统一的
[/Quote]

鼠标点击用gluUnProject()获得的是世界坐标系 ,,模型用的是局部坐标系,,那么坐标系应该就不是统一的吧。应该把世界坐标系转换成模型所在的坐标系??是这样的吗?
  • 打赏
  • 举报
回复
三维实体的坐标系统使用的是局部坐标系 当然不同意, 不经处理(从世界到局部转化)就是统一的,看你的情况是统一的
little_angel 2011-06-05
  • 打赏
  • 举报
回复
我就想知道 gluUnProject()得到的世界坐标点所在的坐标系 和 三维实体的坐标系是统一的吗?我刚接触OpenGL,好多都不懂。。谢谢了
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 j123kaishichufa 的回复:]
引用 1 楼 bhybhybhy2 的回复:
gluUnProject 可以实现从屏幕左标点 到世界左标点的转化。
要看鼠标是否选中三维实体, 可以根据2点(gluUnProject可以得到视景体的前后面2个交点) 作射线,求射线和实体是否交点

gluUnProject()得到的世界坐标点所在的坐标系 和 三维实体的坐标系是统一的吗??不是同一个坐标系的话怎么转换?
[/Quote]查查线形代数的书吧
little_angel 2011-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bhybhybhy2 的回复:]
gluUnProject 可以实现从屏幕左标点 到世界左标点的转化。
要看鼠标是否选中三维实体, 可以根据2点(gluUnProject可以得到视景体的前后面2个交点) 作射线,求射线和实体是否交点
[/Quote]
gluUnProject()得到的世界坐标点所在的坐标系 和 三维实体的坐标系是统一的吗??不是同一个坐标系的话怎么转换?
  • 打赏
  • 举报
回复
gluUnProject 可以实现从屏幕左标点 到世界左标点的转化。
要看鼠标是否选中三维实体, 可以根据2点(gluUnProject可以得到视景体的前后面2个交点) 作射线,求射线和实体是否交点
little_angel 2011-06-05
  • 打赏
  • 举报
回复
GLdouble object_x;
GLdouble object_y;
GLdouble object_z;
GLint viewport[4];
GLdouble mvmatrix[16];
GLdouble projmatrix[16];
GLdouble wx,wy,wz; //窗口坐标赋值

glGetIntegerv(GL_VIEWPORT,viewport); //获取近裁剪面上的焦点
glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);

wx=(float)point.x;
wy=(float)viewport[3]-(float)point.y;
//读深度缓存中的数据
glReadPixels(point.x, int(wy),1,1,GL_DEPTH_COMPONENT,GL_FLOAT, &wz);
gluUnProject((GLdouble)wx,(GLdouble)wy,(GLdouble)wz,mvmatrix,projmatrix,viewport,&object_x,&object_y,&object_z);



这是我的代码。。。。。wz 是用gluUnProject()得到的,只能得到一个wz.
要不在我代码上改一下。。。。。。???提一些建议,,,,谢谢了

19,468

社区成员

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

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