[osg-users] how to configure camera to multi window

Tran Thanh Hiep hiep45t2003 at yahoo.com
Thu Oct 4 01:42:12 PDT 2007


Thank! Robert 
I 'm using osg1.2 and os windowxp. I develop my project on Visual C++.Net-2003(MFC).
I have using 4 same class follow to render scene:

class CMyView : public CView
{
DECLARE_DYNCREATE(CMyView)
protected:
CMyView();           // protected constructor used by dynamic creation
virtual ~CMyView();
void DoFrame();
// Attributes
osg::ref_ptr<Producer::KeyboardMouse> m_KBM;
// Callback
osg::ref_ptr<MFCKeyboardMouseCallback> m_KBMCallback;
// We will use Producer render surface
//osg::ref_ptr<Producer::RenderSurface> m_RenderSurface;
Producer::RenderSurface *m_RenderSurface;
// THE scene
//osg::ref_ptr<osgUtil::SceneView> m_SceneView;
osgUtil::SceneView * m_SceneView;
// Database Pager
osgDB:atabasePager* m_DatabasePager;
// Tell is the render surface has been realized
BOOL m_bRenderSurfaceRealized;
// Tell is the model was loaded
BOOL m_bModelLoaded;
// Start 
 osg::Timer_t m_StartTick;
// Frame Number
unsigned int m_uiFrameNum;
BOOL m_bGotFocus;
public:
CMultiSplitterSampleDoc *GetDocument() const
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMultiSplitterSampleDoc)));
return (CMultiSplitterSampleDoc*) m_pDocument;
}
virtual void OnDraw(CDC* pDC);      // overridden to draw this view
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
virtual void OnUpdate(CView *pSender,LPARAM lHint,CObject *pHint);
virtual void OnInitialUpdate();
protected:
DECLARE_MESSAGE_MAP()
afx_msg int  OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnPaint();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeaveMessage(WPARAM wp, LPARAM lp);
afx_msg LRESULT OnStartRendering(WPARAM,LPARAM);
};


and with KeyboardMouseCallback i use class follow:



// CMyView view
class MFCKeyboardMouseCallback : public Producer::KeyboardMouseCallback
{
public:
    MFCKeyboardMouseCallback(osgUtil::SceneView* sceneView) :
        Producer::KeyboardMouseCallback(),
        _mx(0.0f),
  _my(0.0f),
  _mbutton(0),
  _done(false),
  
        _trackBall(new Producer::Trackball),
        _sceneView(sceneView)
    {
        resetTrackball();
  _mouseMovingOnPreviousRelease = false;
    }
  //friend osg::Node * __classFriend::CreateBoundBox(float s,osg::Vec3 pos);
 void home()
 {
  resetTrackball();
  _mouseMovingOnPreviousRelease = false;
 }
    virtual void keyPress( Producer::KeyCharacter key)
    {
        if (key==' ') resetTrackball();
    }
    virtual void mouseMotion( float mx, float my ) 
    {
        _mx = mx;
        _my = my;
    }
    virtual void buttonPress( float mx, float my, unsigned int mbutton ) 
    {
         _mx = mx;
         _my = my;
         _mbutton |= (1<<(mbutton-1));
         
         _mx_buttonPress = _mx;
         _my_buttonPress = _my;
    }
    virtual void buttonRelease( float mx, float my, unsigned int mbutton ) 
    {
        _mx = mx;
        _my = my;
        _mbutton &= ~(1<<(mbutton-1));
  
  if (_mx==_mx_buttonPress && _my_buttonPress==_my)
        {
            if (!_mouseMovingOnPreviousRelease)
            {
                // button press and release without moving so assume this means
                // the users wants to pick.
                pick(mx,my);
            }
            _mouseMovingOnPreviousRelease = false;
        }
        else
        {
            _mouseMovingOnPreviousRelease = true;
        }
    }
 virtual void shutdown()
    {
        _done = true; 
    }
    float mx()  { return _mx; }
    float my()  { return _my; }
    unsigned int mbutton()  { return _mbutton; }
    
    void resetTrackball()
    {
        osg::Node* scene = _sceneView->getSceneData();
        if (scene)
        {
            const osg::BoundingSphere& bs = scene->getBound();
            _trackBall->reset();
            _trackBall->setOrientation( Producer::Trackball::Z_UP );
   _trackBall->setDistance(bs.radius()*2.0);
            _trackBall->translate(-bs.center().x(),-bs.center().y(),-bs.center().z());
   _trackBall->translate(-bs.center().x(),-bs.center().y(),0);
        }
    }
    
    osg::Matrixd getViewMatrix()
    {
  _trackBall->input( mx(), my(), mbutton() );
        return osg::Matrixd(_trackBall->getMatrix().ptr());
    }
 bool done(){ return _done; }
 void pick(float x, float y)
    {
        osg::Node* scene = _sceneView->getSceneData();
        if (scene)
        {
            int origX, origY, width, height;
            _sceneView->getViewport(origX,origY,width,height);
            // convert Produce's non dimensional x,y coords back into pixel coords.
            int winX = (int)((x+1.0f)*0.5f*(float)width);
            int winY = (int)((y+1.0f)*0.5f*(float)height);
            osg::Vec3 nearPoint, farPoint;
            _sceneView->projectWindowXYIntoObject(winX,winY,nearPoint,farPoint);
           // make a line segment
            osg::ref_ptr<osg::LineSegment> lineSegment = new osg::LineSegment(nearPoint,farPoint); 
            // create the IntersectVisitor to do the line intersection traversals.
            osgUtil::IntersectVisitor intersector;
            intersector.addLineSegment(lineSegment.get());
            
            scene->accept(intersector);
            
            osgUtil::IntersectVisitor::HitList& hits=intersector.getHitList(lineSegment.get());
            if (!hits.empty())
            {
                // just take the first hit - nearest the eye point.
                osgUtil::Hit& hit = hits.front();
    /* 
                osg::NodePath& nodePath = hit._nodePath;
                osg::Node* node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
                osg::Group* parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
    osg::Matrix m=node->getWorldMatrices()[0];
    osg::Vec3 v44=m.getTrans();
    v44.z()+=node->computeBound().center().z();
    */
    //__classFriend *f_cf=new __classFriend();
    //scene->asGroup()->replaceChild(scene->asGroup()->getChild(0),f_cf->CreateBoundBox(node->getBound().radius()*1.5,/*node->computeBound().center()+*/v44));//createPoint(v1,v2,v3)
   }
            
        }        
        
    }
 
 //friend class __classFriend;
private:
 bool                                   _mouseMovingOnPreviousRelease;
    float                               _mx, _my;
    float                               _mx_buttonPress, _my_buttonPress;
    unsigned int                        _mbutton;
 bool        _done;   
 
    osg::ref_ptr<Producer::Trackball>   _trackBall;
    osg::ref_ptr<osgUtil::SceneView>    _sceneView;
 
};

//UINT WM_OSGSTARTRENDERING = ::RegisterWindowMessage(_T("WM_OSGSTARTRENDERING"));
class GetWorldMatrix : public osg::NodeVisitor
{
public:
 GetWorldMatrix():
        osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)    
    {
    }
    
    virtual void apply(osg::Node& node)
    {
  osg::NodePath p = this->getNodePath();
   mt=osg::computeWorldToLocal(p);
   
   //int i=mt(0,0);
        osgFX::Scribe* scribe = dynamic_cast<osgFX::Scribe*>(&node);
        if (scribe)
        {
            
        }
        else
        {
            traverse(node);
        }
    }
     virtual void apply(osg::Geode& node) 
     { 
  osg::NodePath p = this->getNodePath();
   osg::Matrix m=osg::computeWorldToLocal(p);
   //osg::Matrix m=osg::computeLocalToWorld(p);
   osg::Vec3 vcenter=node.computeBound().center();
   
   osg::Vec3 vt= m.getTrans();
  // node.getWorldMatrices();
        
         traverse(node); 
     } 
  osg::Matrix matrixTransform()
  {
   return mt;
  }
  osg::Matrix mt;
};
class CreateModelToSaveVisitor : public osg::NodeVisitor
{
public:
 CreateModelToSaveVisitor(osg::Vec3 vTemp,int i=0):
        osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)    
    {
  rs=false;
  NowPoint=vTemp;
  iID=i;
    }
    
    virtual void apply(osg::Node& node)
    {
        osgFX::Scribe* scribe = dynamic_cast<osgFX::Scribe*>(&node);
        if (scribe)
        {
            
        }
        else
        {
            traverse(node);
        }
    }
     virtual void apply(osg::Geode& node) 
     { 
   osg::NodePath p = this->getNodePath();
   osg::Matrix m=osg::computeWorldToLocal(p);
   //osg::Matrix m=osg::computeLocalToWorld(p);
   osg::Vec3 vcenter=node.computeBound().center();
   
   osg::Vec3 vt= m.getTrans();
  // node.getWorldMatrices();
         for(unsigned int i=0;i<node.getNumDrawables();++i) 
        { 
             osg::Drawable* drawable = node.getDrawable(i); 
             if (drawable) 
             { 
     osg::BoundingSphere b=drawable->getBound();
    osg::Geometry *pgeo=dynamic_cast<osg::Geometry*>(drawable);    
    if(pgeo)
    {
     
     osg::Vec3Array *parray=dynamic_cast<osg::Vec3Array*>(pgeo->getVertexArray());
     float space=50.0;
     int u=parray->getNumElements();
     for(int id=0;id<u;id++)
     {
      osg::Vec3 p1=(*parray)[id]; 
      //p1.z()=0;
      //p1+=vcenter;
      b.center().z()=0;
      //osg::Vec3 v=p1*b.center();
      float a1=NowPoint.x()-p1.x()+vt.x();
      float a2=NowPoint.y()-p1.y()+vt.y();
      float a3=NowPoint.z()-p1.z()+vt.z();
      float distance;
      distance=sqrtf(a1*a1+a2*a2+a3*a3);
      if(distance<space)
      {
       rs=true;
       if((iID<=14)||((iID>=21)&&(iID<=25)))
        {
         p1.y()+=10;
        }
        else if((iID>=15)&&(iID<=20))
         p1.x()-=10;
        else if(iID>=26)
         p1.x()+=10;
       //AfxMessageBox("aaaa");
       //if(!this->getIntersection(iTemp,p1,pPs))
       p1.y()+=10;
       
      }
      (*parray)[id]=p1;
     }
     pgeo->setVertexArray(parray);
    }
             } 
         } 
          
         traverse(node); 
     } 
  bool kq()
  {
   return rs;
  }
  bool rs;
  int iID;
  osg::Vec3 NowPoint;
};




----- Original Message ----
From: Robert Osfield <robert.osfield at gmail.com>
To: OpenSceneGraph Users <osg-users at lists.openscenegraph.org>
Sent: Thursday, October 4, 2007 3:28:47 PM
Subject: Re: [osg-users] how to configure camera to multi window


Hi Tran,

You'll have to explain more about what the problem is.  A screenshot
of what you are getting.  Please also specify which version of the OSG
your are using, what operating system, what graphics hardware, and
what viewer classes you are using.  Without this information no body
has enough information to know what might be wrong and won't be able
to help you.

Robert.

On 10/4/07, Tran Thanh Hiep <hiep45t2003 at yahoo.com> wrote:
>
> hi all!
> I split my window to 4 paths and i want each window that will render 1 face
> of object.(front, left, right and perpactive). but when i debug each
> rendered window  doesn't display true. Could you help me to slove this?
>
>  ________________________________
>  Check out the hottest 2008 models today at Yahoo! Autos.
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
osg-users at lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


      ____________________________________________________________________________________
Don't let your dream ride pass you by. Make it a reality with Yahoo! Autos.
http://autos.yahoo.com/index.html
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20071004/56a047fe/attachment-0003.htm>


More information about the osg-users mailing list