case WM_MOUSEMOVE:
gCamera->Yaw() = (float)LOWORD(lparam);
gCamera->Pitch() = (float)HIWORD(lparam);
break;
Yaw和Pitch方法基本上返回对数据成员mPitch和mYaw的引用,并通过它们,我对基础向量(向右,向上和向量)进行旋转
只是为了澄清,我WM_MOUSEMOVE正在获取输入(我通过调试检查),但它变得非常高和非常错误的值,因为我甚至没有移动鼠标,因为相机正在向各个方向旋转,就像它只是吃了一些火箭燃料。
P.S:我必须对值进行类型转换,因为我使用Yaw和Pitch来创建矩阵,我必须使用浮点数。
感谢帮助,伙计们
答案 0 :(得分:0)
请记住您的单位。 WM_MOUSEMOVE lparam x& y值在逻辑(屏幕像素)坐标中,但游戏中的大多数旋转值都以度或弧度表示。例如,如果小鼠处于< 400,300>但是你的相机类需要弧度,然后你在变换数学中将大量旋转与其他(可能变化的)数字相乘,即使你没有移动鼠标也可能导致疯狂的移动。在这种情况下,解决方案是使用您选择的比例因子将逻辑单位转换为弧度或度数。
回应进一步评论: 考虑它的一种方法是问自己一个问题:你想要对应360度旋转的运动逻辑单位是多少?
例如,如果您决定要在窗口的整个宽度上移动鼠标以对应360度,那么数学关系就是
screenW * scaleFactor = 2 * PI
解决scaleFactor然后使用以下方法将其应用于未来的鼠标值:
mouseX * scaleFactor = orientationInRadians
请记住,此方法会将绝对鼠标位置与绝对相机方向(至少一个DOF)相关联,因此您可能希望跟踪鼠标位置的变化,而不是绝对鼠标位置;然后计算方向(弧度)的变化以应用于现有方向。可以使用相同的公式将delta(变化量)从逻辑坐标转换为弧度。