查看: 2235|回复: 19

鼠标点击得到的是什么系下的坐标??

[复制链接]

该用户从未签到

发表于 2010-3-3 21:00:48 | 显示全部楼层 |阅读模式
本帖最后由 cuixinxin 于 2010-3-3 23:29 编辑

鼠标点击得到的是什么系下的坐标?在一条有许多小线段组成的线路line.osg文件,line.osg的组织结构是mat->mat->geode->gemoetry这样line.osg上的顶点verter坐标是什么系下的?它们怎么转换为一个坐标系下进行比较??
我具体要实现的是:怎么让鼠标点击到的小线段上时让其高亮的问题!!!具体怎么实现??请高手指点!谢谢!!

该用户从未签到

发表于 2010-3-4 08:28:24 | 显示全部楼层
阅读一下我的书《OSG三维渲染引擎设计与实践》的第七章会对您的理解有一些好处。鼠标点所在的只是二维屏幕坐标系,Geometry的顶点则处于上一级节点所定义的局部坐标系下。需要把前者通过过渡矩阵变换到后者的坐标系中。这些直接使用IntersectionVisitor就可以做到了~~至于让线段高亮,方法很多,实现各有不同,比较实用的做法是设置Geometry的颜色数组来实现

该用户从未签到

 楼主| 发表于 2010-3-4 08:55:40 | 显示全部楼层
谢谢!不过我还是有一些不懂的地方,请您不吝指点!
坐标转换具体是让鼠标确定点*mat(geode上一级的mat)??
实现各个线段的选中,具体怎么用intersectionvisor实现??我尝试用linesegment,但并未达到效果!

该用户从未签到

发表于 2010-3-4 09:11:48 | 显示全部楼层
LinsegmentIntersector没有问题,可能是您的用法不对而已,参考一下osgpick例子。

OSG内部是使用一个堆栈来记录各个节点级别的模型视点矩阵和投影矩阵的,因此您不必替它担心,在IntersectionVisitor遍历节点树的过程中,自然会根据这两个矩阵取得正确的局部坐标系

该用户从未签到

 楼主| 发表于 2010-3-4 09:47:47 | 显示全部楼层
就是说要实现我说的功能,用鼠标点击点进行坐标转换为局部坐标,然后比较坐标值与线段点这在osg内部已经有封装好的intersectionvistor来实现,所以直接用intersectionvistor来实现即可吧。
刚您说的用linesegment可以实现,那我再研究研究。

该用户从未签到

发表于 2010-3-4 09:53:16 | 显示全部楼层
LinsegmentIntersector就是IntersectionVisitor的一个必备参数,如果您对此不了解,那么请参看osgpick例子

该用户从未签到

 楼主| 发表于 2010-3-4 10:04:03 | 显示全部楼层
那例子我看了,不过我把模型换为我的line.osg不能实现效果~~,我不清楚具体的怎么回事??

该用户从未签到

发表于 2010-3-4 10:15:05 | 显示全部楼层
线段也得有包围盒吧~~

该用户从未签到

发表于 2010-3-4 10:21:26 | 显示全部楼层
7# cuixinxin

有一个需要注意的问题是:LinsegmentIntersector只支持三角面、四边形面以及多边形面的求交判断。如果您的数据是点线对象的话,那么是无法进行求交的,因为通常情况下鼠标能选中一条无宽度的线的可能性是微乎其微的;您需要根据自己的特定需求来自己编写相应的Intersector派生类,构建专门的点线求交器,我们在实际应用中也大都是这样做的

该用户从未签到

 楼主| 发表于 2010-3-4 14:16:55 | 显示全部楼层
抛开鼠标操作的点的话,应用osgUtil:laneIntersector(plane, polytope )可以实现面与线的交点吧,这样一个特定的交点吧。
那自己写的话,就要涉及到矩阵的过渡转换之类的东西呀,这个转换还是比较麻烦的
不知道哪位高手有相关类似的例子可以贡献一下???

该用户从未签到

发表于 2010-3-4 14:59:13 | 显示全部楼层
我倒是已经实现了完整的点线求交算法,从思想上来说:本身只是简单的数学而已,比较麻烦的是如何根据当前视点的远近判断能否选中线段,我是参考clampPixelVector计算得到空间单位的像素长度并作为参照的。不过出于对工作单位的负责,很遗憾我不能公开我的代码

该用户从未签到

 楼主| 发表于 2010-3-4 16:52:05 | 显示全部楼层
理解,不过还是谢谢您的不吝赐教!!

该用户从未签到

 楼主| 发表于 2010-3-4 17:29:53 | 显示全部楼层
有吧,不过具体还是没实现呀~~~~~

该用户从未签到

 楼主| 发表于 2010-3-4 17:42:33 | 显示全部楼层
麻烦您了,还有一个问题,受到8#启示,那我用包围盒把线段包起来,然后求交可以??

该用户从未签到

发表于 2010-3-4 22:47:09 | 显示全部楼层
可以,不过通常这并不准确,因为包围盒是AABB盒

该用户从未签到

发表于 2010-3-5 16:00:05 | 显示全部楼层
请看 array新书 第七章

该用户从未签到

 楼主| 发表于 2010-3-7 16:02:25 | 显示全部楼层
哦,这样呀。那自己如果想定义包围盒,具体应该怎么实现??

该用户从未签到

发表于 2010-3-8 09:11:26 | 显示全部楼层
OSG的包围盒总是可以通过getBound()获得,它的主要作用是用于构建场景BVH层次树;如果想自己建立一个包围盒对象的话,可以直接新建BoundingBox实例。专用于碰撞检测的包围盒还有OBB盒和K-Dop等几种,具体实现的算法都已经比较成熟,您可以自行搜索。

该用户从未签到

发表于 2011-10-20 09:48:59 | 显示全部楼层
mark一下,鼠标点击……

该用户从未签到

发表于 2011-10-20 10:14:13 | 显示全部楼层
回复 18# array


    您出新书了?叫什么名字?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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