我尝试更新相机时遇到问题。
我想通过鼠标改变相机的俯仰和偏航(它的外观) 但我希望鼠标保持定位在窗口的中心。
//where MouseP.x .y is the mouse position
//(which is centered to the current window)
//get old position of the mouse
OldP.x = MouseP.x;
OldP.y = MouseP.y;
//work out the distance traveled
Delta.x = MouseP.x - OldP.x;
Delta.y = MouseP.y - OldP.y;
//update the camera(using distance traveled)
Rot.Yaw -=Delta.x/5;
Rot.Pitch -= Delta.y/5;
//move mouse to the center of the screen
SetCursorPos(CENTER_SCREEN_X,CENTER_SCREEN_Y);
问题是当鼠标设置为返回原点时,相机会快速回到某一点。
我希望按原点行进的距离更新相机,而不是距离原点的距离。
如果我把它取出来,它可以很好地工作,但是当时的鼠标可以走出窗外。
答案 0 :(得分:2)
人们必须小心光标和3D鼠标移动。人们倾向于认为它是相关的,但事实上并非如此。 阅读msdn上的文章: http://msdn.microsoft.com/en-us/library/windows/desktop/ee418864%28v=vs.85%29.aspx “利用高清鼠标移动” 这就是必须在3D应用程序中输入鼠标的方法。 应该隐藏光标。
如果你试图重新定位它,它会产生一种可怕的锯齿状感觉,光标试图通过用户移动鼠标逃离中心,但是被一个看不见的弹簧保持在原位。哪个看起来不太专业。你无法对抗,因为你的应用程序没有在鼠标光标显示之前安排。
答案 1 :(得分:1)
我认为这里的问题是你的代码块可能在WM_MOUSEMOVE
事件的捕获范围内?
当您致电SetCursorPos
时,它本身会生成另一个WM_MOUSEMOVE
事件,因此您在移动鼠标时会处理此代码块,而在您调用SetCursorPos
时会再次处理此代码块与此相反。
您可能不希望将SetCursorPos
放在WM_MOUSEMOVE事件catch中,否则您将生成无限循环的消息(每SetCursorPos
生成另一个消息)。
也许您可以将此代码移到消息泵之外,并在更新循环中每帧运行一次:查询当前鼠标位置,使相机变换,然后将光标设置回原点。
答案 2 :(得分:0)
if(g_States::Instance().MouseLook())
{
//Test the mouse input
POINT mousePos;
GetCursorPos(&mousePos);
mouseX = mousePos.x; //g_InputEngine::Instance().GetX();
mouseY = mousePos.y; //g_InputEngine::Instance().GetY();
mouseX = mouseX - m_HalfWidth;
mouseY = mouseY - m_HalfHeight;
mouseFloat = mouseX * C_MOUSESMOOTHINGFACTOR;
g_Scene::Instance().GetCamera()->RotateYaw(-mouseFloat);
mouseFloat = mouseY * C_MOUSESMOOTHINGFACTOR;
g_Scene::Instance().GetCamera()->RotatePitch(mouseFloat);
//Reset mouse to center on the screen
SetCursorPos(m_HalfWidth,m_HalfHeight);
}
所以这是一个spacegame原型的Mouselook函数,我正在开发一段时间后,我所做的就是将它更改为使用GetCursorPos(&mousePos);
代替。无论您的输入代码何时更新鼠标光标位置,都将获得光标的当前位置。该功能的其余部分仅用于灵敏度并实际旋转相机。希望这段代码有助于让你的工作有所帮助。
如果您需要更多解释,请告诉我。
编辑:我记得我这样做的原因。这是因为屏幕闪烁它会移动,但输入引擎会被SetCursorPos()
调用更新,因为我使用WM_MOUSEMOVE来更新输入引擎。我不确定你是如何得到你的意见的,但这仍然可以帮到你。