Jump to: navigation, search

Difference between revisions of "Ogre3D:Snippets"

(Created page with "== Raycasting ==")
 
m (Frankiezafe moved page Ogre3D Snippets to Ogre3D:Snippets: new namespace)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
== Raycasting ==
 
== Raycasting ==
 +
 +
    float srcx = float( arg.state.X.abs ) / Ogre::Real(vp->getActualWidth());
 +
    float srcy = float( arg.state.Y.abs ) / Ogre::Real(vp->getActualHeight());
 +
    // out of viewport
 +
    if ( srcx < 0 || srcx > 1 || srcy < 0 || srcy > 1 ) {
 +
        return true;
 +
    }
 +
    Ogre::Ray r = mCamera->getCameraToViewportRay( srcx, srcy );
 +
    Ogre::RaySceneQuery* rquery = mSceneMgr->createRayQuery( r );
 +
    rquery->setSortByDistance( true );
 +
    Ogre::RaySceneQueryResult rresults = rquery->execute();
 +
    Ogre::SceneNode* newovered = 0;
 +
    Ogre::Real newd;
 +
    if ( rresults.size() > 0 ) {
 +
        newovered = rresults[0].movable->getParentSceneNode();
 +
        newd = rresults[0].distance;
 +
    }
 +
    // if ( newovered == groundNode ) newovered = 0;
 +
    overed = newovered;
 +
    if ( overed != 0 ) {
 +
        Ogre::Quaternion ho = overed->getPosition().getRotationTo( r.getPoint( newd ) );
 +
        overed->setOrientation( ho );
 +
        // cout << r.getOrigin().x << " / " << r.getOrigin().y << " / " << r.getOrigin().z << endl;
 +
        // cout << overed->getPosition().x << " / " << overed->getPosition().y << " / " << overed->getPosition().z << endl;
 +
    }
 +
    mSceneMgr->destroyQuery( rquery );

Latest revision as of 18:51, 20 April 2016

Raycasting

   float srcx = float( arg.state.X.abs ) / Ogre::Real(vp->getActualWidth());
   float srcy = float( arg.state.Y.abs ) / Ogre::Real(vp->getActualHeight());
   // out of viewport
   if ( srcx < 0 || srcx > 1 || srcy < 0 || srcy > 1 ) {
       return true;
   }
   Ogre::Ray r = mCamera->getCameraToViewportRay( srcx, srcy );
   Ogre::RaySceneQuery* rquery = mSceneMgr->createRayQuery( r );
   rquery->setSortByDistance( true );
   Ogre::RaySceneQueryResult rresults = rquery->execute();
   Ogre::SceneNode* newovered = 0;
   Ogre::Real newd;
   if ( rresults.size() > 0 ) {
       newovered = rresults[0].movable->getParentSceneNode();
       newd = rresults[0].distance;
   }
   // if ( newovered == groundNode ) newovered = 0;
   overed = newovered;
   if ( overed != 0 ) {
       Ogre::Quaternion ho = overed->getPosition().getRotationTo( r.getPoint( newd ) );
       overed->setOrientation( ho );
       // cout << r.getOrigin().x << " / " << r.getOrigin().y << " / " << r.getOrigin().z << endl;
       // cout << overed->getPosition().x << " / " << overed->getPosition().y << " / " << overed->getPosition().z << endl;
   }
   mSceneMgr->destroyQuery( rquery );