OGRE 鼠标拾取模型并显示
2010-03-16 10:11
393 查看
之前想做个编辑器那样的,需要拾取功能,于是研究了下。
拾取模型用射线相交的方法。通过摄像机的getCameraToViewportRay把鼠标坐标转换成RAY,然后通过 RaySceneQueryResult来进行场景查询,可以得到场景上所有与该射线相交的对象。然后取1个距离最近的相交对象作为拾取的对象,这样拾取 的对象就获得了。为了显示该对象被拾取,获取下该MESH的BOUNDINGBOX,我偷懒用了Ogitor的Box绘制类,直接把获取到的 BOUNDINGBOX设置上去,再在对象的父节点下创建个子节点,attachObject设置好的BOX,设置节点显示,然后就OK了。
code:
Ogre::MovableObject* WFreeRotateManipulator::_VaneBoxRayQuery(int x,int y,float view_left,float view_top,float view_width,float view_height)
{
float rect_left = mWindowWidth*view_left;
float rect_top = mWindowHeight*view_top;
float rect_right = rect_left+mWindowWidth*view_width;
float rect_bottom = rect_top+mWindowHeight*view_height;
float rect_width = mWindowWidth * view_width;
float rect_height = mWindowHeight * view_height;
if(x<rect_left || x>rect_right || y<rect_top || y>rect_bottom) return NULL;
float sx = float(x-rect_left)/rect_width;
float sy = float(y-rect_top)/rect_height;
if(!mRaySceneQuery || !mVaneBoxCamera) return NULL;
Ogre::Ray mouseRay = mVaneBoxCamera->getCameraToViewportRay(sx, sy);
mRaySceneQuery->setRay(mouseRay);
mRaySceneQuery->setSortByDistance(true);
mRaySceneQuery->setQueryMask(VANE_BOX_MASK);
//mRaySceneQuery->setQueryTypeMask(Ogre::SceneManager::FX_TYPE_MASK);
// Execute query
Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator itr = result.begin();
// Get results, create a node/entity on the position
for ( itr = result.begin(); itr != result.end(); itr++ )
{
if (itr->movable && itr->movable->isVisible() && itr->movable->getQueryFlags() == VANE_BOX_MASK)
{
return itr->movable;
} // if
} // for
return NULL;
}
拾取模型用射线相交的方法。通过摄像机的getCameraToViewportRay把鼠标坐标转换成RAY,然后通过 RaySceneQueryResult来进行场景查询,可以得到场景上所有与该射线相交的对象。然后取1个距离最近的相交对象作为拾取的对象,这样拾取 的对象就获得了。为了显示该对象被拾取,获取下该MESH的BOUNDINGBOX,我偷懒用了Ogitor的Box绘制类,直接把获取到的 BOUNDINGBOX设置上去,再在对象的父节点下创建个子节点,attachObject设置好的BOX,设置节点显示,然后就OK了。
code:
Ogre::MovableObject* WFreeRotateManipulator::_VaneBoxRayQuery(int x,int y,float view_left,float view_top,float view_width,float view_height)
{
float rect_left = mWindowWidth*view_left;
float rect_top = mWindowHeight*view_top;
float rect_right = rect_left+mWindowWidth*view_width;
float rect_bottom = rect_top+mWindowHeight*view_height;
float rect_width = mWindowWidth * view_width;
float rect_height = mWindowHeight * view_height;
if(x<rect_left || x>rect_right || y<rect_top || y>rect_bottom) return NULL;
float sx = float(x-rect_left)/rect_width;
float sy = float(y-rect_top)/rect_height;
if(!mRaySceneQuery || !mVaneBoxCamera) return NULL;
Ogre::Ray mouseRay = mVaneBoxCamera->getCameraToViewportRay(sx, sy);
mRaySceneQuery->setRay(mouseRay);
mRaySceneQuery->setSortByDistance(true);
mRaySceneQuery->setQueryMask(VANE_BOX_MASK);
//mRaySceneQuery->setQueryTypeMask(Ogre::SceneManager::FX_TYPE_MASK);
// Execute query
Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator itr = result.begin();
// Get results, create a node/entity on the position
for ( itr = result.begin(); itr != result.end(); itr++ )
{
if (itr->movable && itr->movable->isVisible() && itr->movable->getQueryFlags() == VANE_BOX_MASK)
{
return itr->movable;
} // if
} // for
return NULL;
}
相关文章推荐
- OGRE 鼠标拾取模型并显示
- Unity3d 用鼠标拾取模型的顶点
- Unity3d 用鼠标拾取模型顶点 三
- ogre中显示模型线框
- 【转】Ogre 1.9 起步——加载Sinbad模型并显示
- Ogre中模型显示纹理不对齐的情况
- OGRE 鼠标拾取
- Unity3d 用鼠标拾取模型的顶点
- OGRE1.7以上版本隐藏LOGO及鼠标拾取物体关键
- CEGUI OGRE ISO中文显示输入整合,鼠标独占问题,窗口创建
- Unity3d 用鼠标拾取模型的顶点
- Cesium 鼠标拾取椭球、地形、模型坐标点(经度+纬度+高程)
- Ogre 1.9 起步——加载Sinbad模型并显示
- Unity3d 用鼠标拾取模型的顶点 二
- ogre中的鼠标拾取
- Ogre 获取显示鼠标位置
- Unity鼠标中键滚动缩放相机,左键点击场景中模型居中显示
- .ani动态鼠标指针图像无法显示
- Android Studio 鼠标悬停文档显示fetching documentation的问题
- dedecms鼠标停留在标题显示完整标题