鼠标事件不会在winforms中更新相机旋转

本文关键字:更新 相机 旋转 winforms 事件 鼠标 | 更新日期: 2023-09-27 18:28:05

我的应用程序有一个自定义面板,用于在WinForm中显示XNA屏幕。我目前已经展示了一个没有问题的测试模型,现在正在研究相机的移动。我的相机是一个自由相机(不一定要看任何特定的目标),但我一直很难让鼠标更新相机在自己轴上的偏航和俯仰。我想我的更新方法可能有问题,但事实并非如此,因为相机使用KeyboardState前后更新。但我不知道为什么MouseState不起作用。

FreeCamera.cs

using XNAButtonState = Microsoft.Xna.Framework.Input.ButtonState;
....
MouseState pastMouseState;
private float rotationSpeed_ = 1f / 60f;
private float yaw_, pitch_;
...
private void updateMatrix()
    {
        Matrix rotationMatrix = Matrix.CreateRotationX(pitch_) *
                                Matrix.CreateRotationY(yaw_);
        Vector3 forward = new Vector3(0, 0, 1);
        forward = Vector3.Transform(forward, rotationMatrix);
        viewMatrix_ = Matrix.CreateLookAt(Position, Position + forward, Up);
        projectionMatrix_ = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.PiOver4, 16.0f / 9.0f, 0.1f, 100000.0f);
    }
 private void cameraInput()
    {
        KeyboardState keyboardState = Keyboard.GetState(); <-- updates
        currentMouseState = Mouse.GetState();              <-- not updating
        if (currentMouse.LeftButton == XNAButtonState.Pressed)         
            pitch_ -= rotationSpeed_;
        if (keyboardState.IsKeyDown(Keys.W))
            move(1);
        if (keyboardState.IsKeyDown(Keys.S))
            move(-1);
        pastMouseState = currentMouseState;
     }

public void update()
    {
        cameraInput();
        updateMatrix();

鼠标事件不会在winforms中更新相机旋转

为了使用XNA的鼠标API(而不是WinForm事件),必须适当地设置Mouse.WindowHandle(MSDN)。

如果你使用的是官方样本,那么把它放在MainForm的构造函数中就可以了:

Mouse.WindowHandle = this.Handle;

(当然是using Microsoft.Xna.Framework.Input;