4

当我尝试更新我的相机时遇到问题。

我想通过鼠标更改相机的俯仰和偏航(它的外观)但我希望鼠标保持定位在窗口的中心。

//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);

问题是当鼠标设置为返回原点时,相机会快速返回到某个点。

我想通过从原点行进的距离而不是返回原点的距离来更新相机。

如果我把它拿出来,它会很好地工作,但当时的鼠标可能会离开窗口。

4

3 回答 3

2

必须小心光标和 3D 鼠标移动。人们倾向于认为它是相关的,但实际上并非如此。阅读来自 msdn 的文章:http: //msdn.microsoft.com/en-us/library/windows/desktop/ee418864%28v=vs.85%29.aspx “利用高清鼠标移动”这是如何在 3D 应用程序中获得鼠标输入。光标应该被隐藏。

如果您尝试将其重新居中,则会产生一种可怕的锯齿感,其中光标试图在用户移动鼠标时逃离中心,但被一个看不见的弹簧保持在原位。这看起来不是很专业。您无法抗拒,因为您的应用程序未在鼠标光标显示之前安排。

于 2012-05-15T09:19:53.160 回答
1

我相信这里的问题是您的代码块可能在WM_MOUSEMOVE事件的捕获中?

当您调用 时SetCursorPos,它本身会生成另一个WM_MOUSEMOVE事件,因此您在移动鼠标时处理该代码块一次,并在您调用时再次SetCursorPos处理它,它的作用与此相反。

您可能不想将SetCursorPosWM_MOUSEMOVE 事件捕获放在内部,否则您将生成一个无限循环的消息(每个都会SetCursorPos生成另一个消息)。

也许您可以将此代码移到消息泵之外,并在更新循环中每帧运行一次:查询当前鼠标位置,进行相机变换,然后将光标设置回原点。

于 2012-05-07T20:43:39.817 回答
-1
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);
}

所以这是我之前为了好玩而开发的一个太空游戏原型的 Mouselook 功能,我所做的就是改变它来使用它GetCursorPos(&mousePos);。无论您的输入代码何时更新鼠标光标位置,这都会获取光标的当前位置。函数中的其余数学仅用于灵敏度和实际旋转相机。希望这段代码能帮助你的工作。

如果您需要更多解释,请告诉我。

编辑:我只记得我这样做的原因。这是因为屏幕闪烁它会移动,但是输入引擎会通过SetCursorPos()调用更新,因为我正在使用 WM_MOUSEMOVE 来更新输入引擎。我不确定您是如何获得您的意见的,但这仍然应该对您有所帮助。

于 2012-05-08T00:26:39.590 回答