查看: 1927|回复: 14

新手求助:如何点中“空间中的两点”。。。(画线)

[复制链接]

该用户从未签到

发表于 2012-10-22 19:42:04 | 显示全部楼层 |阅读模式
本帖最后由 mxl12315 于 2012-10-24 00:51 编辑

最近结合handle()函数和geometry的画线内容做了个程序
意思:
       (1)鼠标双击确定一个点,之后在其他位置再双击确定一个点
       (2)鼠标右键——>生成一条线段
  可是我写了半天只能在平面中点上那个点,或者点在建筑物上,脱离建筑物或者地面就为无法在空间中双击形成一个点了。。。。。请各位大神指点代码中的错误~


想要的效果:
2.jpg

该用户从未签到

发表于 2012-10-23 07:52:12 | 显示全部楼层
没有和场景相交,那需要您指定Z了,在根据MVPW 逆运算来求出空间点

该用户从未签到

发表于 2012-10-23 10:49:55 | 显示全部楼层
liuzhiyu123 发表于 2012-10-23 07:52
没有和场景相交,那需要您指定Z了,在根据MVPW 逆运算来求出空间点

有木有办法 第一点鼠标与场景求交,得到空间中的一点,鼠标移动未能和场景有交点!可否根据鼠标在视口中X,Y值的变化与获取的第一个交点的空间坐标,计算出鼠标移动过程中的空间坐标!

该用户从未签到

 楼主| 发表于 2012-10-23 20:02:55 | 显示全部楼层
liuzhiyu123 发表于 2012-10-23 07:52
没有和场景相交,那需要您指定Z了,在根据MVPW 逆运算来求出空间点

是这样,您提到的矩阵运算我很同意,我也改进了代码,将点从屏幕坐标转换到世界坐标。。但是,指定Z值恐怕不行,因为我是自身在空中点一个点的,它的Z值可以是任何的,目的就是能与地面那个起始点连成一条线。。。如果指定了空间中那个点的Z值,那空间中双击形成点就没有意义了,您看如何改进?

该用户从未签到

 楼主| 发表于 2012-10-23 20:16:41 | 显示全部楼层
本帖最后由 mxl12315 于 2012-10-30 09:17 编辑
liuzhiyu123 发表于 2012-10-23 07:52
没有和场景相交,那需要您指定Z了,在根据MVPW 逆运算来求出空间点


这是我新改的代码,它的意思是与窗体求交,并将得到的交点转换成世界坐标,最后以这个点为圆心画个小球,当中涉及相机的远近点以及坐标转换~ ~  您帮忙看一下,给些思路~


(1)调试问题

1.jpg

2.jpg

可以看到断点调试中,当遇到if那个语句块(if (picker->containsIntersections()) {})时直接跳过!哎。。。郁闷

(2)运行异常
2.jpg

该用户从未签到

发表于 2012-10-24 07:45:44 | 显示全部楼层
不指定Z值 算出来的只能是一条射线 有窗口的x,y 还需要一个 0~1的Z值

该用户从未签到

 楼主| 发表于 2012-10-24 09:21:25 | 显示全部楼层
liuzhiyu123 发表于 2012-10-24 07:45
不指定Z值 算出来的只能是一条射线 有窗口的x,y 还需要一个 0~1的Z值

其实,我代码中已经设置了Z值,不过是涉及近远点的
osg::Vec3d nearPoint = osg::Vec3d( ea.getX(), ea.getY(), 0.0)* _inverseMVPW;//透视投影中Znear平面的交点
osg::Vec3d farPoint = osg::Vec3d( ea.getX(), ea.getY(), 1.0)* _inverseMVPW;//透视投影中Zfar平面的交点

osg::ref_ptr< osgUtil:ineSegmentIntersector > picker =new osgUtil::LineSegmentIntersector(nearPoint, farPoint);//线段(真实的世界坐标)

关键是这个picker创建完了,针对于他的判断(picker->containsIntersections())我进不去,直接跳过,说明这个线段检测没有交集。。。。~类似的例子我也找过,但人家这样判断都没问题。。。您看下我的代码,我都困惑不知道哪里出错了。。。

该用户从未签到

发表于 2012-10-24 09:52:30 | 显示全部楼层
LineSegmentIntersector 的坐标类型设置的什么?

该用户从未签到

 楼主| 发表于 2012-10-24 13:26:53 | 显示全部楼层
liuzhiyu123 发表于 2012-10-24 09:52
LineSegmentIntersector 的坐标类型设置的什么?

osg::Vec3d

该用户从未签到

 楼主| 发表于 2012-10-24 14:53:14 | 显示全部楼层
本帖最后由 mxl12315 于 2012-10-24 21:36 编辑
liuzhiyu123 发表于 2012-10-23 07:52
没有和场景相交,那需要您指定Z了,在根据MVPW 逆运算来求出空间点


问题截图:
1.jpg

改动代码:
osg::Matrix mtxModelView= viewer->getCamera()->getViewMatrix();
osg::Matrix mtxProject = viewer->getCamera()->getProjectionMatrix();
osg::Matrix mtxWindow = viewer->getCamera()->getViewport()->computeWindowMatrix();

osg::Vec3 vecWindowPt(x, y, 0.0f);

osg::Matrix mtxMVPW = mtxModelView * mtxProject * mtxWindow;
osg::Matrix mtxInverseMVPW = osg::Matrix::inverse(mtxMVPW);

osg::Vec3 vecWorldPt = vecWindowPt * mtxInverseMVPW;
pointList->push_back(vecWorldPt);

osg::ref_ptr<osg::Geode>sp2=new osg::Geode;
sp2->addDrawable(new osg::ShapeDrawable(new osg::Sphere(vecWorldPt,40.0f)));
viewer->getSceneData()->asGroup()->addChild(sp2.get())

该用户从未签到

发表于 2012-10-25 07:56:51 | 显示全部楼层
mxl12315 发表于 2012-10-24 14:53
问题截图:

??

该用户从未签到

发表于 2012-10-25 09:36:05 | 显示全部楼层
点别处无法拾取到点的,....

该用户从未签到

发表于 2012-10-25 09:36:19 | 显示全部楼层
这是拾取的基本思想

该用户从未签到

发表于 2012-10-25 09:36:56 | 显示全部楼层
巴掌要打到脸上才感觉到疼得,一样的道理

该用户从未签到

 楼主| 发表于 2012-10-25 15:33:34 | 显示全部楼层
liuzhiyu123 发表于 2012-10-25 07:56
??

您看下我的代码为什么得到这样的效果呢?就是截图中那样,我应该如何修改才能实现我想要的效果,就是地面上点一个点,它上方处再点击一个点。。。我现在在它正上方点一下,这个新生成的点跑到了别的地方(见截图)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表