查看: 1673|回复: 3

请教:拖拽器的实现问题

[复制链接]

该用户从未签到

发表于 2010-6-3 09:59:52 | 显示全部楼层 |阅读模式
我参考例子代码和Array大哥的《OpenSceneGraph三维渲染引擎设计与实践》里面拖拽器的例子,想实现对场景中模型的平移,旋转等操作。拖拽器的添加都没有问题,但是在鼠标选中模型,移动的时候模型位置并不会改变。经调试发现,在鼠标PickHandler函数里:

  1. osg::NodePath::iterator itr;
  2. for (itr = Pointer._hitList.front().first.begin();
  3. itr != Pointer._hitList.front().first.end(); ++itr)
  4. {
  5. osgManipulator::Dragger* dragger = dynamic_cast<osgManipulator::Dragger*>(*itr);
  6. if (dragger)
  7. {
  8. dragger->handle(Pointer, ea, aa);
  9. ActiveDragger = dragger;
  10. break;
  11. }
  12. }
复制代码

dragger的指针一直为空,但是itr是有值的啊。不知道问题出在哪里?以下是一些相关的代码,贴出来供大家查看,是否是这些代码的问题。谢谢!

  1. //自定义消息响应函数,向场景中添加模型
  2. LRESULT CMy3DGISView::OnImportModelToScene(WPARAM wParam,LPARAM lParam)
  3. {
  4. //从参数面板获得模型导入需要的参数,包括模型路径,模型将导入场景的位置。
  5. CChildFrame* pFrame = (CChildFrame*)GetParentFrame();
  6. osg::Vec3d importModelCoords = pFrame->GetFunctionParaSheet()->SceneCreatPage.ImportModelDlg->GetImportModelCoords();
  7. CString modelPathName = pFrame->GetFunctionParaSheet()->SceneCreatPage.ImportModelDlg->GetImportModelPathName();
  8. USES_CONVERSION;
  9. std::string strModelPathName =W2A(modelPathName.LockBuffer());
  10. modelPathName.UnlockBuffer();

  11. //传递模型路径名和空间位置到图形绘制模块
  12. MFCOSG->SetImportedModelPathName(strModelPathName);
  13. MFCOSG->SetImportedModelPosition(importModelCoords);

  14. //为每个待加入的模型创建一个命令管理器,以便后面对模型的拖拽所用
  15. MFCOSG->SetCommandManager();

  16. //创建一个新的线程,用于加载模型
  17. ImportThreadHandle =  (HANDLE)_beginthread(&CMFCOSG::AddModelToScene, 0, MFCOSG);
  18. return 1;
  19. }
复制代码


以下是线程函数的代码:

  1. void CMFCOSG::AddModelToScene(void* ptr)
  2. {
  3. CMFCOSG* mfcOsg = (CMFCOSG*)ptr;

  4. //获得模型待导入的空间位置,和模型文件路径名称。
  5. osg::Vec3d position = mfcOsg->GetImportedModelPosition();
  6. std::string modelname = mfcOsg->GetImportedModelPathName();
  7. //读取模型
  8. osg::ref_ptr<osg::Node> importedModel = osgDB::readNodeFile(modelname);
  9. //创建位置变换节点
  10. osg::ref_ptr<osg::PositionAttitudeTransform> modelPat = new osg::PositionAttitudeTransform();
  11. modelPat->setPosition(position);
  12. modelPat->addChild(importedModel.get());
  13. //创建矩阵变换节点
  14. osg::ref_ptr<osg::MatrixTransform> modelMatrix = new osg::MatrixTransform;

  15. //为模型添加拖拽器
  16. modelMatrix.get()->addChild(mfcOsg->AddDraggerToModel(modelPat.get(),mfcOsg->GetCommandManager()));
  17. mfcOsg->GetSceneRoot()->addChild(modelMatrix.get());

  18. //结束线程
  19. _endthread();
  20. }
复制代码

以下是为模型添加拖拽器的代码:
osg::Node* CMFCOSG::AddDraggerToModel(osg::ref_ptr<osg::Node> model,  osg::ref_ptr<osgManipulator::CommandManager> cmdMgr)
{
     //将模型加入selcetion
    osgManipulator::Selection* selection = new osgManipulator::Selection;
     selection->addChild(model.get());
     
    osgManipulator::TranslateAxisDragger* dragger = new    osgManipulator::TranslateAxisDragger();
      dragger->setupDefaultGeometry();
     
      osg::Group* root = new osg::Group;
      root->addChild(selection);
      root->addChild(dragger);

     float scale = model->getBound().radius() * 1.6;
     dragger->setMatrix(osg::Matrix::scale(scale, scale, scale) *
     osg::Matrix::translate(model->getBound().center()));

     cmdMgr->connect(*dragger, *selection);

     return root;
}

该用户从未签到

发表于 2010-6-3 10:31:50 | 显示全部楼层
“但是在鼠标选中模型,移动的时候模型位置并不会改变”

TranslateAxisDragger 移动的话是要选中那几个箭头而不是模型。

该用户从未签到

 楼主| 发表于 2010-6-3 10:49:58 | 显示全部楼层
我测试了一下,选中哪几个箭头,dragger的值也为空。

该用户从未签到

 楼主| 发表于 2010-6-3 12:42:48 | 显示全部楼层
问题解决了,是因为我的把第一段代码写到了pick事件里。谢谢各位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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