OSG学习笔记19——再看pick点选物体
来源:互联网 发布:win10桌面软件不见了 编辑:程序博客网 时间:2024/05/22 14:25
之前一直使用的pick方法就是将第一个点选到的节点保存下来,如果场景中只有一个物体,当然是没有问题的。当场景中出现多个物体,并且每个物体设置了标签,是可以被修改还是不能被修改,当两个物体重合的时候就不能得到正确的结果。
正确的做法是:用迭代器遍历所有获取到的节点并再遍历nodePath,找到需要的节点,并根据标签判断其是否可以被选中来执行操作。
这里我对物体标签设置的方法应该是不够科学的,我用了一个全局变量,一个map来保存了模型的名字和一个布尔值
extern ModelIndex modelIndex;
主函数中是std::list<ModelManage> modelList;model1->setName("aorta");modelIndex[model1->getName()] = true;其中 ModelIndex是 std::map < std::string, bool >的别名,每添加一个模型,就给map中以模型节点为名字,bool为值向map中新增节点。
暂时想不到更好的方法。如果你们有好一点的想法,请务必告诉我!
下面贴出pick的实现。其实和之前的没有多大的变化,详细介绍见 <OSG学习笔记16>
void PQEventHandler::pick(double x, double y){osgUtil::LineSegmentIntersector::Intersections intersections;if (viewer->computeIntersections(x, y, intersections)){std::cout << " trying to pick sth" << "x: " << x << " y: " << y << std::endl;osgUtil::LineSegmentIntersector::Intersections::iterator hitr;for (hitr = intersections.begin(); hitr != intersections.end(); ++hitr){if (!hitr->nodePath.empty() ){const osg::NodePath& np = hitr->nodePath;for (int i = np.size() - 1; i >= 0;--i){osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(np[i]);if (mt != NULL){std::cout << mt->getName() << std::endl;ModelIndex::iterator miitr;miitr = modelIndex.find(mt->getName());if (miitr == modelIndex.end()){continue;}else{if (modelIndex[mt->getName()]){PickObject = true;picked = mt;rotateCenter =hitr->getWorldIntersectPoint();}else{continue;}}}}}}}else{PickObject = false;picked = NULL;}}
1 0
- OSG学习笔记19——再看pick点选物体
- OSG学习笔记13Pick点选物体
- osg点选pick物体
- OSG学习笔记11 物体控制—对点选物体进行平移、缩放、旋转
- OSG学习笔记16 - 对点选物体平移(鼠标点选物体)(物体随鼠标移动)(屏幕坐标转世界坐标)
- OSG学习笔记17——正确设置物体的缩放矩阵
- OSG学习笔记24——根据鼠标平移的位置正确设置物体平移量
- OSG学习笔记6—鸟瞰图相机
- OSG学习笔记0——解决OSG读obj模型问题
- OSG学习笔记1——智能指针
- OSG学习笔记21——有关getProjectionMatrixAs...的trick
- OSG学习笔记2—节点属性访问器
- OSG学习笔记4—使用空间变换节点
- OSG学习笔记5—使用开关节点
- OSG学习笔记7—投影墙显示
- OSG学习笔记
- OSG学习笔记18
- OSG学习笔记01:OSG的安装
- ubuntu14.04.1 安装配置jdk1.7
- php开发环境集成
- Lucene教程地址
- R-table和tapply函数
- Union-Find问题
- OSG学习笔记19——再看pick点选物体
- C++动态内存:(三) new-handler和set_new_handler
- CentOS6.5配置 cron 任务
- Eclipse 安装 SVN 插件的两种方法
- Python PyQuery的用法
- java使用移位运算进行进制转化
- 使用DashPathEffect绘制一条动画曲线
- cnpm不是内部或外部命令 cnpm: command not found 解决方案 cnpm
- javascript之你要懂得规则