WM_MOUSEMOVE无法在Direct3D中使用FPS相机实现

时间:2011-03-10 05:59:07

标签: c++ direct3d

嘿伙计们, 我正在尝试实现FPS = Style相机。鼠标移动正在工作,但甚至没有触摸鼠标。相机在没有我甚至触摸鼠标的情况下都在进行。基本上,偏航和俯仰从鼠标获得错误的值而没有鼠标本身的移动。 这是win32循环的代码

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

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

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

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

感谢帮助,伙计们

1 个答案:

答案 0 :(得分:0)

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

回应进一步评论: 考虑它的一种方法是问自己一个问题:你想要对应360度旋转的运动逻辑单位是多少?

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

screenW * scaleFactor = 2 * PI

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

mouseX * scaleFactor = orientationInRadians

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