查看: 2128|回复: 14

求助:MFC下的控件操作Camera

[复制链接]

该用户从未签到

发表于 2011-9-27 08:29:07 | 显示全部楼层 |阅读模式
采用freesouth的MFC框架搭建了一个简单的OSG程序,现在想实现一个功能,就是通过MFC中的Slider控件控制水平视角和俯仰视角,在osg核心类里面定义了一个
  1. class ViewControl :public osgGA::CameraManipulator
复制代码


继承了四个虚函数:
vi
  1. rtual void setByMatrix(const osg::Matrixd &matrix)
  2. virtual void setByInverseMatrix(const osg::Matrixd& matrix)
  3. virtual osg::Matrixd getMatrix() const
  4. virtual osg::Matrixd getInverseMatrix() const
复制代码

同时自己定义了一个操作的函数
  1. void ChangePosition(osg::Vec3 delta)
复制代码

在响应键盘时在ViewControl 类里面的
  1. bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us )
复制代码

函数响应,通过changeposition函数可以实现,
但是换成在C***view下的控件响应函数里面就没有什么反应了
如果不用changeposition,而用setByMatrix ,在C***view下的控件响应函数里面也可以实现相关的控制,但是里面对旋转视角等遇到问题,不知道在虚函数里面进行定义

  1. virtual void setByMatrix(const osg::Matrixd &matrix)
  2. {
  3.   m_vPosition = matrix.getTrans();//定义的camera位置
  4.   osg::Quat qut = matrix.getRotate();//camera的旋转
  5. }
复制代码

上面的osg:uat 获取了以后,怎么赋值给我在ViewControl 类里面定义的旋转参数 osg::Vec3 m_vRotation;
在handle函数里面:
响应键盘按键的代码:

  1.    if (ea.getKey() == 0xFF53) //Right arrow
  2.    {
  3.     m_vRotation._v[2] -= osg::DegreesToRadians(m_fAangle);
  4.    }
复制代码

现在就是想通过类似这样的方式来实现,但是在C***view类里面没有响应 。该如何修改???
不知道我的问题说清楚了没有。。。。

请各位大牛指正!!!

该用户从未签到

 楼主| 发表于 2011-9-27 08:29:44 | 显示全部楼层
自己顶一下!!!!

该用户从未签到

发表于 2011-9-28 08:47:49 | 显示全部楼层
您到底在控件里做了什么?遇到了什么问题?

该用户从未签到

 楼主| 发表于 2011-9-28 15:33:25 | 显示全部楼层
我想用slider控件来进行视角的改变 但是没有响应, 在OnTimer中获取slider的值赋给ViewControl 中定义的m_vPosition 或者 m_vRotarion 来对视角进行变化 但是没用, 如果是采用继承的虚函数 setbyMatrix的话就可以!!!

该用户从未签到

 楼主| 发表于 2011-9-28 15:37:47 | 显示全部楼层
其实我就是想通过修改自己定义的操作器中的位置和旋转变量来实现Camera的操作,如旋转,高度等的变化!!求Array帮助!

该用户从未签到

发表于 2011-9-29 08:37:19 | 显示全部楼层
您自己已经回答了,用setByMatrix()

该用户从未签到

 楼主| 发表于 2011-9-29 15:31:13 | 显示全部楼层
但是我不知道如何在继承的虚函数里面进行相关的操作?

setByMatrix()函数里面的参数定义的是一个矩阵,我获取这个以后 如何对原来的矩阵进行操作???

该用户从未签到

发表于 2011-9-30 08:57:43 | 显示全部楼层
您在纠结什么?我怎么不理解?什么是原来的矩阵,您派生了哪个Manipulator,就在setByMatrix()的实现里把位置姿态矩阵的值转换成这个漫游器内部的变量(例如Trackball就是_distance,_center和_rotation)即可

该用户从未签到

 楼主| 发表于 2011-10-2 20:15:52 | 显示全部楼层
派生的类:   class ViewControl :public osgGA::CameraManipulator

virtual void setByMatrix(const osg::Matrixd &matrix)

这里传递进来的matrix后怎么修改我自己定义的位置和旋转变量:

这样可以不:
m_vPosition = matrix.getTrans();
直接赋值
但是旋转变量获取以后:
osg:uat qut = matrix.getRotate();
m_vRotation怎么赋值?

该用户从未签到

 楼主| 发表于 2011-10-2 20:29:28 | 显示全部楼层
OSG没怎么用过 多多指正!!

该用户从未签到

发表于 2011-10-3 21:53:52 | 显示全部楼层
上面你已经自己给出答案了,如果你对矩阵和四元数不熟悉的话,直接用写个函数设置m_vRotation就ok了

该用户从未签到

 楼主| 发表于 2011-10-4 12:47:19 | 显示全部楼层
看来还是要其他途径解决了  我自己写的函数changeposition()在MFC的view类中调用不行

该用户从未签到

发表于 2011-10-4 20:07:02 | 显示全部楼层
请确认你的代码是否正确,调试跟踪一下计算结果

该用户从未签到

 楼主| 发表于 2011-10-5 19:56:03 | 显示全部楼层
调试了 修改后进入了changeposition函数 修改的值也正确 但是表现出来却是没有改变。。。木有办法啊

该用户从未签到

发表于 2011-10-5 21:57:46 | 显示全部楼层
调试了 修改后进入了changeposition函数 修改的值也正确 但是表现出来却是没有改变。。。木有办法啊
Seabird 发表于 2011-10-5 19:56


看一下setByMatrix函数的调用时机吧,是不是只有在有事件发生的时候才调用的,
你使用mfc的控件调用changeposition函数,因为没有触发osg的事件所以最终没有调用setByMatrix,
因此“表现出来却是没有改变。。。”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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