社区
图形处理/算法
帖子详情
VC++OpenGL 鼠标点击屏幕获取三维模型的三维坐标
little_angel
2011-06-05 10:05:42
我用VC++OpenGL实现了读取文件显示出三维网格模型。
现在我想实现: 鼠标点击屏幕上的一个点,从而获取该点在三维模型上的三维坐标。
大家帮帮我,谢谢了。
...全文
863
20
打赏
收藏
VC++OpenGL 鼠标点击屏幕获取三维模型的三维坐标
我用VC++OpenGL实现了读取文件显示出三维网格模型。 现在我想实现: 鼠标点击屏幕上的一个点,从而获取该点在三维模型上的三维坐标。 大家帮帮我,谢谢了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
谁是我的谁的谁
2011-06-13
打赏
举报
回复
[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]
我就这样做,射线法和模型求交。 程序昨晚刚搞定。但是程序有两个问题: 一是:有时候点击得到的点位置准确,有的点击得到的点位置很不准确。 二是:有时候点击的点就没有找到射线和模型的哪个三角形相交?好奇怪...
现在就是调程序 找问题了。。唉..
谁是我的谁的谁
2011-06-13
打赏
举报
回复
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),.这差别不会太大了啊???这两个坐标和元模型的数据是不是统一的。我直接用这个坐标所在的直线 和原模型碰撞,看这条直线和原模型的的那个三角形面片相交。。这样行吗?
谁是我的谁的谁
2011-06-11
打赏
举报
回复
忘记当时怎么考虑的了 计算误差?
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;
.
谁是我的谁的谁
2011-06-06
打赏
举报
回复
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);
.........
}
谁是我的谁的谁
2011-06-06
打赏
举报
回复
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;
}
谁是我的谁的谁
2011-06-05
打赏
举报
回复
好像得到一个交点, 方向 0, 0, 1 的射线也可以
谁是我的谁的谁
2011-06-05
打赏
举报
回复
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()获得的是世界坐标系 ,,模型用的是局部坐标系,,那么坐标系应该就不是统一的吧。应该把世界坐标系转换成模型所在的坐标系??是这样的吗?
谁是我的谁的谁
2011-06-05
打赏
举报
回复
三维实体的坐标系统使用的是局部坐标系 当然不同意, 不经处理(从世界到局部转化)就是统一的,看你的情况是统一的
little_angel
2011-06-05
打赏
举报
回复
我就想知道 gluUnProject()得到的世界坐标点所在的坐标系 和 三维实体的坐标系是统一的吗?我刚接触OpenGL,好多都不懂。。谢谢了
谁是我的谁的谁
2011-06-05
打赏
举报
回复
[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()得到的世界坐标点所在的坐标系 和 三维实体的坐标系是统一的吗??不是同一个坐标系的话怎么转换?
谁是我的谁的谁
2011-06-05
打赏
举报
回复
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.
要不在我代码上改一下。。。。。。???提一些建议,,,,谢谢了
【
OpenGL
】
鼠标
点击
获取
世界
坐标
【
OpenGL
】
鼠标
点击
获取
世界
坐标
标签(空格分隔):
OpenGL
起因 因为最近在做图形学相关毕设,需要时间
鼠标
交互
获取
三维
坐标
(世界
坐标
系)。于是在网上查了一些博客与资料,放进自己代码中,效果怎么都不对。于是才自己静下心来,好好研究。
OpenGL
中的
坐标
系
OpenGL
总共有5个
坐标
系,它们分别是: 局部空间或称物体空间 世界空间 观察空间或称视觉空间 ...
Opengl
二维
坐标
转
三维
坐标
Opengl
二维
坐标
转
三维
坐标
由于项目的功能需求,需要通过
点击
屏幕
来
获取
屏幕
中物体的
三维
坐标
(
屏幕
中显示的是一个球,球是由成千上万个对象画成的)。之前看过一篇文章说每件事情都是经过:学习、尝试、失败、灵感、成功的过程。没错,不过我在第二步和第三步差点陷入死循环。就如同网上说的,自从学了3D数学,从懵逼到无限懵逼。由于刚开始接触
opengl
,很多东西都不熟悉。后面接触后,个人觉得最重要的还是矩阵
opengl
屏幕
坐标
到
三维
坐标
的转换
1.方法一: 见链接:
OpenGL
之
坐标
转换 最后要注意的事情是在
获取
变换矩阵和视口的时候有可能发生错误,所以这时需要重新做变换矩阵代码如下: GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, po
opengl
鼠标
交互(
屏幕
二维
坐标
到
三维
世界
坐标
的转换)
void CMFC
opengl
View::WindowsToGL(CPoint pt, GLdouble &posX, GLdouble &posY, GLdouble &posZ) { GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; //GLdouble posX, posY, posZ; glPushMatrix()...
使用
OpenGL
实现
三维
坐标
的
鼠标
拣选
原文地址:http://blog.csdn.net/hb_zha/article/details/6768235 使用
OpenGL
实现
三维
坐标
的
鼠标
拣选 Implementation of RIP(Ray-Intersection-Penetration) 3D Coordinates Mouse Selection Using
OpenGL
顾 露 (武汉理工大学 计算机系 中科院智能
图形处理/算法
19,468
社区成员
50,700
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章