我正在调整一些框架代码以了解OpenGL的工作原理,并在SphericalCameraManipulator.cpp
中使用它,这使我可以在按住鼠标右键的同时平移和倾斜摄像机:
void SphericalCameraManipulator::handleMouseMotion(int x, int y)
{
//Motion
float xMotion = (float)x - previousMousePosition[0];
float yMotion = (float)y - previousMousePosition[1];
if(reset)
{
xMotion = yMotion = 0.0;
reset = false;
}
this->previousMousePosition[0] = (float)x;
this->previousMousePosition[1] = (float)y;
//Right Button Action
if(this->currentButton == GLUT_RIGHT_BUTTON && this->currentState == GLUT_DOWN)
{
this->pan -= xMotion*this->panTiltMouseStep ;
this->tilt += yMotion*this->panTiltMouseStep ;
}
//Enforce Ranges
this->enforceRanges();
}
我删除了鼠标左键,因为我不希望它控制相机,现在它在主代码主体中执行命令。
//Left Button Action
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
... //game action
}
我的问题是,当我单击鼠标左键时,取消了鼠标右键的按下,并且必须释放并按下鼠标右键才能继续控制摄像机。
是否有防止这种情况发生的方法?它打断了游戏流程。我正在使用GLUT
答案 0 :(得分:0)
Rabbid76的评论说没有鼠标按住事件将我设置在正确的路径上。
我写了一个小函数,简单地记录了鼠标按钮2(“相机环视”按钮)的最后状态:
void SphericalCameraManipulator::handleMouse(int button, int state)
{
this->currentButton = button;
this->currentState = state;
//to enable mouse look around
if (this->currentButton == 2) //right mouse
this->lastLookState = this->currentState;
if(this->currentState == GLUT_UP)
{
reset = true;
}
}
这意味着即使当前状态与鼠标左键有关(游戏动作),由于没有发生“鼠标两键向上”事件,仍然可以环顾四周:
this->currentButton = 2;
this->currentState = 1;