查看: 3006|回复: 11

请问高手osgviewerMFC例子中怎么修改以指定正视图顶视图呢?

[复制链接]

该用户从未签到

发表于 2011-6-6 22:39:24 | 显示全部楼层 |阅读模式
请问高手osgviewerMFC例子中怎么修改以指定正视图顶视图呢?
就是模型一加载之后的显示视图,正视图、顶视图、左视图、还有从(1,1,1)看(0,0,0)的斜着的视图

还有,模型移动后,如何复位呢?

该用户从未签到

发表于 2011-6-15 17:12:07 | 显示全部楼层
唉,真不容易,参照
http://bbs.osgchina.org/viewthread.php?tid=5595
中wanghuisoftware的方法实现了,不知道楼主要的是不是这个
    osg::Matrixd d ;
    osg::BoundingSphere bs =  m_prtCurNode->getBound();

    switch (direction)
    {
    case MODEL_DIRECTION_TOP:
        d.makeLookAt(bs._center+osg::Vec3( 0.0,0.0f,3.5f * bs._radius),bs._center,osg::Vec3(0.0f,1.0f,0.0f));
        break;
    case MODEL_DIRECTION_BOTTOM:
        d.makeLookAt(bs._center-osg::Vec3( 0.0,0.0f,3.5f * bs._radius),bs._center,osg::Vec3(0.0f,1.0f,0.0f));
        break;
    case MODEL_DIRECTION_FRONT:
        d.makeLookAt(bs._center-osg::Vec3( 0.0,3.5f * bs._radius,0.0f),bs._center,osg::Vec3(0.0f,1.0f,1.0f));
        break;
    case MODEL_DIRECTION_BACK:
        d.makeLookAt(bs._center+osg::Vec3( 0.0,3.5f * bs._radius,0.0f),bs._center,osg::Vec3(0.0f,1.0f,1.0f));
        break;
    case MODEL_DIRECTION_LEFT:
        d.makeLookAt(bs._center-osg::Vec3( 3.5f * bs._radius,0.0,0.0f),bs._center,osg::Vec3(0.0f,0.0f,1.0f));
        break;
    case MODEL_DIRECTION_RIGHT:
        d.makeLookAt(bs._center+osg::Vec3( 3.5f * bs._radius,0.0,0.0f),bs._center,osg::Vec3(0.0f,0.0f,1.0f));
        break;
    }

    GetViewer()->getCameraManipulator()->setByInverseMatrix(d);

该用户从未签到

发表于 2011-6-7 08:39:01 | 显示全部楼层
设置每个View的投影矩阵和观察矩阵即可。正视图、顶视图、左视图可以用正交投影的方式来表达,同时在回调里根据主视图的当前相机位置来调整它们的观察矩阵

至于复位这类的操作,我想完全是由您自己的控制方式来决定的

该用户从未签到

 楼主| 发表于 2011-6-10 05:57:13 | 显示全部楼层
本帖最后由 osg2010 于 2011-6-10 06:03 编辑

一直登陆不上来论坛,前天回的帖子竟然都没啦

非常感谢array!
我通过修改osgViewerMFC做了一个简单的模型浏览程序,全部源代码在这里
http://ishare.iask.sina.com.cn/f/16046666.html
现在想基于这个程序实现改变视图和复位的操作,应该怎么办呢?

源代码大体这样的,基于对话框的工程,CosgTesterDlg是对话框类,有一个相同大小的子窗口CWndOsg显示OSG模型,第一次按下右键时会打开模型 C:\\osg\\data\\glider.osg
CWndOsg :

  1. class CWndOsg : public CWnd
  2. {
  3.        。。。。。。。。。。
  4.         cOSG * mOSG;
  5.         HANDLE mThreadHandle;
  6. };
  7. void CWndOsg::OnLButtonDown(UINT nFlags, CPoint point)
  8. {
  9.         CWnd::OnLButtonDown(nFlags, point);

  10.         static int bFirst=TRUE;
  11.        
  12.         if(bFirst)
  13.         {
  14.                 SetWindowText("CWndOsg");
  15.                 bFirst=FALSE;
  16.                 Open("C:\\osg\\data\\glider.osg");
  17.         }
  18. }

  19. int CWndOsg::Open(LPCTSTR strName)
  20. {
  21.         if(mOSG != 0)
  22.         {
  23.                 delete mOSG;
  24.                 WaitForSingleObject(mThreadHandle, 1000);

  25.                 Sleep(500);
  26.         }

  27.         mOSG = new cOSG(m_hWnd);
  28.         mOSG->InitOSG(strName);
  29.         mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
  30.         return 0;
  31. }
复制代码
CosgTesterDlg:

  1. class CosgTesterDlg : public CDialog
  2. {
  3. .......................
  4. public:
  5.         afx_msg void OnSize(UINT nType, int cx, int cy);
  6.         afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  7.         CWnd * m_pWndChild;
  8. };


  9. int CosgTesterDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
  10. {
  11.         if (CDialog::OnCreate(lpCreateStruct) == -1)
  12.                 return -1;
  13.         CWndOsg * pWndOsg=new CWndOsg ;
  14.         pWndOsg->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,CRect(),this,2001);       
  15.         m_pWndChild=pWndOsg;
  16.         return 0;
  17. }

  18. void CosgTesterDlg::OnSize(UINT nType, int cx, int cy)
  19. {
  20.         CDialog::OnSize(nType, cx, cy);
  21.         // TODO: 在此处添加消息处理程序代码
  22.         if(m_pWndChild)
  23.                 m_pWndChild->MoveWindow(0,0,cx,cy);       
  24.         //CWndOsg * m_pWndChild跟随母窗口的大小变化
  25. }
复制代码

该用户从未签到

 楼主| 发表于 2011-6-10 06:03:05 | 显示全部楼层
# class CWndOsg : public CWnd
# {
#        。。。。。。。。。。
#         cOSG * mOSG;
#         HANDLE mThreadHandle;
# };
这里的cOSG 是 我把osgViewerMFC的MFC_OSG.cpp和MFC_OSG.h直接复制到工程中。


  1. class cOSG
  2. {
  3. public:
  4.     cOSG(HWND hWnd);
  5.     ~cOSG();

  6.     void InitOSG(std::string filename);
  7.     void InitManipulators(void);
  8.     void InitSceneGraph(void);
  9.     void InitCameraConfig(void);
  10.     void SetupWindow(void);
  11.     void SetupCamera(void);
  12.     void PreFrameUpdate(void);
  13.     void PostFrameUpdate(void);
  14.     void Done(bool value) { mDone = value; }
  15.     bool Done(void) { return mDone; }
  16.     static void Render(void* ptr);

  17.     osgViewer::Viewer* getViewer() { return mViewer; }

  18. private:
  19.     bool mDone;
  20.     std::string m_ModelName;
  21.     HWND m_hWnd;
  22.     osgViewer::Viewer* mViewer;
  23.     osg::ref_ptr<osg::Group> mRoot;
  24.     osg::ref_ptr<osg::Node> mModel;
  25.     osg::ref_ptr<osgGA::TrackballManipulator> trackball;
  26.     osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator;
  27. };
复制代码

该用户从未签到

发表于 2011-6-10 08:39:13 | 显示全部楼层
我看不出您做了什么,您的几个视图是用什么作为容器的?View?Camera节点?Slave Camera?

该用户从未签到

 楼主| 发表于 2011-6-10 08:44:04 | 显示全部楼层
全部源代码在这里
http://ishare.iask.sina.com.cn/f/16046666.html
是用View做容器的。

该用户从未签到

发表于 2011-6-10 11:23:25 | 显示全部楼层
表示强烈关注,我也有这个问题想请教

该用户从未签到

发表于 2011-6-12 19:25:18 | 显示全部楼层
这个问题我遇到过的 目前我是这样实现的,希望高人有更好的实现方法.viewer->getCameraManipulator->setHomePosition(eye,center,up);viewer->home();

该用户从未签到

发表于 2011-6-14 18:19:52 | 显示全部楼层
eye,center,up
都该如何计算呢,我是新手,谢谢楼上的兄弟

该用户从未签到

发表于 2011-6-14 19:08:02 | 显示全部楼层
eye,center,up你可以参考array写的指南里的鸟瞰的程序

该用户从未签到

发表于 2011-6-15 16:05:13 | 显示全部楼层
谢谢,不过又发现新问题
这样指定后,不能缩放了。
还有,第二次再使用就不好使了。
为什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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