在ogre3d.cn上面的wiki中级教程二中,其中有一段代码:
if(arg.state.buttonDown(OIS::MB_Left))
{
CEGUI::Point mousePos = CEGUI::MouseCursor::getSingleton().getPosition();
Ray mouseRay = mCamera->getCameraToViewportRay(mousePos.d_x/float(arg.state.width), mousePos.d_y/float(arg.state.height));
mRaySceneQuery->setRay(mouseRay);
RaySceneQueryResult &result = mRaySceneQuery->execute();
RaySceneQueryResult::iterator itr = result.begin();
if(itr != result.end() && itr->worldFragment)
{
mDestination = itr->worldFragment->singleIntersection;
isArrivate = false;
}
}
这段代码是根据鼠标左键点击获取在地图上相对应的坐标,利用指向Y负方向的射线进行定位的。
这段代码在ogre3d中得到很好的运行,但是这里存在一个问题:
一旦我们把camera移动(绕character旋转时),出现有一部分超出worldFragment时,会存在明明在屏幕上可以选取的点,点击了程序却判断该射线没有经过worldFragment的情况(不可选点的多少与移除worldFragment的多少有关,最坏是一个点都无法选取)
if(arg.state.buttonDown(OIS::MB_Left))
{
CEGUI::Point mousePos = CEGUI::MouseCursor::getSingleton().getPosition();
Ray mouseRay = mCamera->getCameraToViewportRay(mousePos.d_x/float(arg.state.width), mousePos.d_y/float(arg.state.height));
mRaySceneQuery->setRay(mouseRay);
RaySceneQueryResult &result = mRaySceneQuery->execute();
RaySceneQueryResult::iterator itr = result.begin();
if(itr != result.end() && itr->worldFragment)
{
mDestination = itr->worldFragment->singleIntersection;
isArrivate = false;
}
}
这段代码是根据鼠标左键点击获取在地图上相对应的坐标,利用指向Y负方向的射线进行定位的。
这段代码在ogre3d中得到很好的运行,但是这里存在一个问题:
一旦我们把camera移动(绕character旋转时),出现有一部分超出worldFragment时,会存在明明在屏幕上可以选取的点,点击了程序却判断该射线没有经过worldFragment的情况(不可选点的多少与移除worldFragment的多少有关,最坏是一个点都无法选取)