用osg实现类似3dmax的编辑窗口,看了一些大神的书和帖子,做出了例子。
最关键的启发是FreeSouth大神发的帖子:http://www.osgchina.org/index.php?option=com_content&view=article&id=134:usecompositiv&Itemid=490
讲的非常明白,一语道破天机。在此由衷感谢!
这个需求关键在于四个视图每个都分别有自己的轨迹球操作,不需要联动。
之前用多相机,addslave,setViewMatrixAsLookAt怎么都不好使,要不动,要不就四个视图一起动(也可能是得自己重写一些方法控制,回调什么的,我不会弄……)。
FreeSouth帖子里讲,多相机的方式addslave,是一个主相机,其它都是跟随主相机的,不能单独操作的。
想要每个视图单独操作要用多视图osgViewer::CompositeViewer,加4个View视图,每个视图一个相机,每个视图有单独的TrackballManipulator操作轨迹球,setSceneData添加的是同一个物体。
接下来参考下example里CompositeViewer的例子,基本就实现了。
这样每个视图都是自由视图,至于四视图效果1,获取当前4视图中获得焦点的视图CompositeViewer->getViewWithFocus();2,获得该视图的操作器;3,先把物体home一下;4,旋转为左视图traceBall->setRotation(osg:Quat(1.0f, -1.0, -1.0, 1.0f));
希望能为之后遇到此问题的人提供一些帮助
附上关键代码:
RECT rect;
::GetWindowRect(m_hWnd, &rect);
osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
// Create the viewer for this window
//创建复合视图compositeViewer对象,及4个视图
m_ViewerSet=new osgViewer::CompositeViewer();
osg::ref_ptr<osgViewer::View> Viewer1 = new osgViewer::View();
osg::ref_ptr<osgViewer::View> Viewer2 = new osgViewer::View();
osg::ref_ptr<osgViewer::View> Viewer3 = new osgViewer::View();
osg::ref_ptr<osgViewer::View> Viewer4 = new osgViewer::View();
//为四个视图创建四个独立的轨迹球
m_traceball1 = new osgGA::TrackballManipulator();
m_traceball2 = new osgGA::TrackballManipulator();
m_traceball3 = new osgGA::TrackballManipulator();
m_traceball4 =