查看: 1348|回复: 8

关于osg制作网页程序时的问题

[复制链接]

该用户从未签到

发表于 2011-5-27 09:43:33 | 显示全部楼层 |阅读模式
我想把自己写的关于摄像机的控制类结合array写的osgActiveX结合到一起,发现有问题,下面我把我的部分代码贴出来,望大家指点指点
这个是array调用我的地方,最后一句就是我自己写的类,当然参照了一些教程

  1. // Create viewer
  2. m_Viewer = new osgViewer::Viewer;
  3. m_Viewer->setThreadingModel( osgViewer::Viewer::SingleThreaded );
  4. m_Viewer->setCamera( camera.get() );
  5. m_Viewer->setCameraWithFocus(camera.get());
  6. m_Viewer->setCameraManipulator( new osgGA::TrackballManipulator );
  7. CTravelManipulator::TravelToScene(m_Viewer);
复制代码


下面是我对这个CTravelManipulator的实现

  1. class CTravelManipulator : public osgGA::MatrixManipulator
  2. {
  3. public:
  4. CTravelManipulator();
  5. CTravelManipulator(Vec3& position);
  6. ~CTravelManipulator();
  7. static CTravelManipulator* TravelToScene(ref_ptr<osgViewer::Viewer> viewer);
  8. virtual void setByMatrix(const osg::Matrixd& matrix);
  9. virtual void setByInverseMatrix(const osg::Matrixd& matrix);
  10. virtual osg::Matrixd getMatrix(void) const;
  11. virtual osg::Matrixd getInverseMatrix(void)const;
  12. virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us);

  13. private:
  14. osg::ref_ptr<osgViewer::Viewer> m_pHostViewer; // 用来检测碰撞测试
  15. ...
  16. ...
  17. };

  18. // 对接口的实现
  19. CTravelManipulator* CTravelManipulator::TravelToScene(ref_ptr<osgViewer::Viewer> viewer)
  20. {
  21. CTravelManipulator* camera = new CTravelManipulator;
  22. viewer->setCameraManipulator(camera);

  23. viewer->getCamera()->setViewMatrixAsLookAt(camera->m_vPosition, Vec3(0,0,100), Vec3(0,0,0));
  24. camera->m_pHostViewer = viewer;
  25.   return camera;
  26. }
复制代码


以上就是大致的一个框架,在网页中或者在调试时,多不能正确的显示

该用户从未签到

发表于 2011-5-30 10:17:11 | 显示全部楼层
我不知道您都做了哪些事情,无法判断什么

该用户从未签到

 楼主| 发表于 2011-5-30 13:22:17 | 显示全部楼层
这个问题我解决了,是那个事件的问题,我还想再问您一下。如何在网页版中捕捉键盘事件,我现在实现的只有鼠标部分,键盘部分好像捕捉不到

该用户从未签到

发表于 2011-5-30 14:39:47 | 显示全部楼层
我依然无法回答,因为我不知道您使用什么样的方式来实现的

该用户从未签到

 楼主| 发表于 2011-5-30 15:35:07 | 显示全部楼层
我是这样实现的,我在你的那个ocx的基础上,添加了自己的方法

  1. // 对接口的实现

  2. // 这是一个静态函数
  3. CTravelManipulator* CTravelManipulator::TravelToScene(ref_ptr<osgViewer::Viewer> viewer)

  4. {

  5. // 在这里实例化了一个自定义的操作器
  6. CTravelManipulator* camera = new CTravelManipulator;

  7. // 将自定义操作器地址赋值
  8. viewer->setCameraManipulator(camera);

  9. viewer->getCamera()->setViewMatrixAsLookAt(camera->m_vPosition, Vec3(0,0,100), Vec3(0,0,0));

  10. // 这一步无关紧要,为了实现碰撞测试用的
  11. camera->m_pHostViewer = viewer;

  12.   return camera;

  13. }

  14. // 以上代码基本上来自于《OpenSceneGraph三维渲染引擎编程指南》一书中的8.2.5中的示例
复制代码
主要就是设置了setCameraManipulator这个的实现方法,然后重写handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us)这个函数,在函数中捕捉鼠标和键盘的动作从而来控制摄像机的角度和坐标。说白了,就是将您的MFC ActiveX控件和编程指南中的一个叫《自定义操作器场景漫游》的例子结合在了一起,其结果就是只有鼠标的动作能够捕捉到,对键盘响应没有捕捉到。不知到是程序问题还是网页中需要修改某些属性,如果您有时间可以简单的做个实验看看。

该用户从未签到

发表于 2011-5-30 16:36:00 | 显示全部楼层
我不可能试验您的例子,不过我现在的activex控件可以捕获鼠标和键盘事件,只要当前窗口占据焦点即可

该用户从未签到

 楼主| 发表于 2011-5-30 16:49:17 | 显示全部楼层
好的,谢谢,我自己试试看吧。

该用户从未签到

发表于 2011-5-31 10:14:17 | 显示全部楼层
可以通过通信方式,告诉控件你都干了什么,com接口也是一种选择

该用户从未签到

 楼主| 发表于 2011-6-1 13:08:38 | 显示全部楼层
我网上搜索了一下,已经解决了。对于键盘上的响应,需要重写一些方法才能实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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