gpt4 book ai didi

c++ - WM_MOUSEMOVE 不适用于 Direct3D 中的 FPS 相机实现

转载 作者:太空宇宙 更新时间:2023-11-04 14:24:21 24 4
gpt4 key购买 nike

大家好,我正在尝试实现 FPS=Style 相机。鼠标移动有效,但甚至没有接触鼠标。在我什至没有触碰鼠标的情况下,相机在各个角度都在运转。基本上,偏航和俯仰是在没有鼠标本身移动的情况下从鼠标获得错误的值。这是 win32 循环的代码

    case WM_MOUSEMOVE:
gCamera->Yaw() = (float)LOWORD(lparam);
gCamera->Pitch() = (float)HIWORD(lparam);
break;

Yaw 和 Pitch 方法基本上返回对数据成员 mPitch 和 mYaw 的引用,通过它们,我对基本 vector (向右、向上和向视 vector )进行旋转

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

P.S:我必须对值进行类型转换,因为我使用 Yaw 和 Pitch 来创建矩阵,我必须使用 float 。

谢谢大家的帮助

最佳答案

记住你的单位。 WM_MOUSEMOVE lparam x 和 y 值是逻辑(屏幕像素)坐标,但游戏中的大多数旋转值都以度数或弧度表示。例如,如果鼠标位于 <400, 300> 但您的相机类需要弧度,那么您将在变换数学中将大量旋转与其他一些(可能变化的)数字相乘,甚至可能导致疯狂移动虽然你没有移动鼠标。这种情况下的解决方案是使用您选择的比例因子将您的逻辑单位转换为弧度或度数。

回应进一步评论:一种思考的方法是问自己一个问题:您希望(通过鼠标)多少个逻辑移动单位对应于 360 度旋转?

例如,如果您决定希望鼠标在整个窗口宽度上的移动对应于 360 度,那么数学关系是

screenW * scaleFactor = 2 * PI

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

mouseX * scaleFactor = orientationInRadians

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

关于c++ - WM_MOUSEMOVE 不适用于 Direct3D 中的 FPS 相机实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5256045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com