Here is the picking method (mouse coordinates [int x, int y] are global screen coordinates):
Code: Select all
bool COgreFramework::picking(int x, int y, String &ausgabe)
{
// Start a new ray query
Ogre::Ray cameraRay = mCamera->getCameraToViewportRay( x, y);
Ogre::RaySceneQuery *raySceneQuery = mSceneMgr->createRayQuery( cameraRay );
raySceneQuery->execute( );
Ogre::RaySceneQueryResult result = raySceneQuery->getLastResults( );
Ogre::MovableObject *closestObject = NULL;
float closestDistance = LONG_MAX; //used to be real
std::list< Ogre::RaySceneQueryResultEntry >::iterator rayIterator;
for ( rayIterator = result.begin( ); rayIterator != result.end( ); rayIterator++ )
{
if ( ( *rayIterator ).distance < closestDistance && ( *rayIterator ).distance > 0.1f )
{
closestObject = ( *rayIterator ).movable;
closestDistance = ( *rayIterator ).distance;
}
}
bool intersects;
// No object clicked
if ( closestObject == NULL )
{
intersects = false;
}
else
{
Ogre::Entity *TestEntity = NULL;
ausgabe = closestObject->getMovableType() + closestObject->getName();
if(closestObject->getMovableType()=="Entity")
{
intersects = true;
TestEntity = (Entity *)closestObject;
}
}
raySceneQuery->clearResults( );
mSceneMgr->destroyQuery( raySceneQuery );
return intersects;
}
Thx, stoneCold
