C++ WM_MOUSEMOVE在Direct3D中不使用FPS摄像头实现

C++ WM_MOUSEMOVE在Direct3D中不使用FPS摄像头实现,c++,direct3d,C++,Direct3d,嘿,伙计们, 我正在尝试实现一个FPS=样式的相机。鼠标移动正在工作,但甚至没有触摸鼠标。我连鼠标都没碰,照相机就一直开着。基本上,在没有移动鼠标的情况下,偏航和俯仰从鼠标获得错误的值。 下面是win32循环的代码 case WM_MOUSEMOVE: gCamera->Yaw() = (float)LOWORD(lparam); gCamera->Pitch() = (float)HIWORD(lparam); break;

嘿,伙计们, 我正在尝试实现一个FPS=样式的相机。鼠标移动正在工作,但甚至没有触摸鼠标。我连鼠标都没碰,照相机就一直开着。基本上,在没有移动鼠标的情况下,偏航和俯仰从鼠标获得错误的值。 下面是win32循环的代码

    case WM_MOUSEMOVE:
        gCamera->Yaw() = (float)LOWORD(lparam);
        gCamera->Pitch() = (float)HIWORD(lparam);
        break;
偏航和俯仰方法基本上返回对数据成员mPitch和mYaw的引用,通过它们,我对基本向量(右、上和看向量)进行旋转

我只是想澄清一下,我WM_MOUSEMOVE正在获取输入(我通过调试进行了检查),但它的值非常高,而且非常错误,因为我甚至没有移动鼠标,因为相机在各个方向旋转,就像它刚刚吃了一些火箭燃料一样

附言:我必须键入值,因为我使用偏航和俯仰来创建矩阵,我必须使用浮动


感谢你们的帮助,伙计们记住你们的单位。WM_MOUSEMOVE lparam x&y值以逻辑(屏幕像素)坐标表示,但游戏中的大多数旋转值以度或弧度表示。例如,如果鼠标位于say,但摄影机类需要弧度,则在变换数学中将大量旋转与其他(可能变化的)数字相乘,即使不移动鼠标,也可能导致疯狂移动。这种情况下的解决方案是使用您选择的比例因子将逻辑单位转换为弧度或度

针对进一步的评论: 思考这个问题的一个方法是问你自己:你希望360度旋转对应多少个逻辑运动单位(通过鼠标)

例如,如果您决定让鼠标在窗口的整个宽度上移动360度,则数学关系为

screenW*scaleFactor=2*PI

求解scaleFactor,然后使用以下方法将其应用于将来的鼠标值:

mouseX*scaleFactor=orientationInRadians


请记住,这种方法将鼠标的绝对位置链接到相机的绝对方向(至少一个自由度),因此您可能希望跟踪鼠标位置的变化,而不是鼠标的绝对位置;然后计算方向变化(弧度)以应用于现有方向。相同的公式可用于将delta(变化量)从逻辑坐标转换为弧度。

查看上面的一行,您可能忘记了一个中断。如果答案有帮助,请记住向上投票或标记为所选答案。谢谢我没有忘记休息。Maestro的方法是合乎逻辑的,因此在这种情况下,0.2是转换为弧度(对于矩阵)的良好比例因子吗?我只是将俯仰和偏航作为比例因子乘以0.0001f。我发现WM_MOUSEMOVE从屏幕左上角开始。如果是这样的话,那么我如何使用它来构建FPS相机??假设对于FPS相机,原点应该在屏幕的中心,而不是边缘。