|
|
小弟想做一个三维场景,里面有几个飞机的模型,再用一个模型做地面和装饰物。想实现用鼠标选中某个飞机使其旋转。不过我不想让鼠标指针显示出来,因为我这里有可以将鼠标直接定到屏幕某个地方的外设,所以意思是说用看不见的鼠标指针实现鼠标点选。
我参考了DEMO的几个例子,好像OGRE默认将鼠标移动控制镜头了,我将ExampleFrameListener.h中的moveCamera中旋转的两行注释掉了,如下,这样移动鼠标不能移动镜头,但键盘可以控制镜头行走:
void moveCamera()
{
// Make all the changes to the camera
// Note that YAW direction is around a fixed axis (freelook style) rather than a natural YAW (e.g. airplane)
// mCamera->yaw(mRotX);
// mCamera->pitch(mRotY);
mCamera->moveRelative(mTranslateVector);
}
但是我担心在看不见鼠标的情况下能不能取到鼠标的位置坐标以实现点选。
我现在实现的程度是参考Demo_BspCollision.cpp中的射线查询的例子,实现了屏幕中心移动到哪个模型上就使得哪个模型旋转,我的frameEnded是这样写的
bool frameEnded(const FrameEvent& evt)
{
bool ret = ExampleFrameListener::frameEnded(evt);
rsq = mSceneMgr->createRayQuery(mCamera->getCameraToViewportRay(0.5,0.5),PLANE_QUERY_MASK);
rsq->setSortByDistance(true,1);
RaySceneQueryResult& rsqResult = rsq->execute();
if (rsqResult.size() != 0)
{
RaySceneQueryResult::iterator ri = rsqResult.begin();
RaySceneQueryResultEntry& res = *ri;
if(((res.movable)->getQueryFlags() & PLANE_QUERY_MASK) != 0)
{
if((res.movable)->getName() == "plane1")
actPlane1 = true; //使飞机1旋转
else if((res.movable)->getName() == "plane2")
actPlane2 = true; //使飞机2旋转
else
;
}
}
return ret;
}
其中有些方法很笨不过实现了也就算了,大家表见笑。不过我现在的问题是不能用“鼠标的位置”实现点选。因为这个鼠标是看不见的(不过用WINDOWNS控制面板的鼠标指针属性里有一个“当按CTRL键时显示鼠标位置”打开这个还是能看到鼠标大概在哪儿的),所以我想请教一下怎么样给射线查询的这句mSceneMgr->createRayQuery(mCamera->getCameraToViewportRay(0.5,0.5),PLANE_QUERY_MASK);中0.5,0.5换成鼠标坐标(或者告诉我根本取不到坐标T_T),小弟初入OGRE不太会取输入量,请教大家应该怎么办? [em24] |
|