Difference between revisions of "Ogre3D:Snippets"
Frankiezafe (Talk | contribs) (Created page with "== Raycasting ==") |
Frankiezafe (Talk | contribs) (→Raycasting) |
||
| 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 ); | ||
Revision as of 17:25, 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 );