我正在开发一个 3D 空间中的国际象棋游戏。我试图弄清楚如何移动这些数字,但相机和不同的鼠标模式让我很头疼。
理念:
有 2 种相机/鼠标输入模式,一种允许我在空间中自由移动并环顾四周(简称为解锁相机/fps 相机),另一种锁定屏幕,我无法移动,鼠标移动不会旋转视图(锁定的相机/没有菜单的菜单相机)。在锁定模式下,我将能够选择碎片下方的正方形,并通过我投射到场景中的光线将它们移动到不同的正方形到我的光标位置。
我有的:
根据 learnopengl.com https://learnopengl.com/code_viewer_gh.php?code=includes/learnopengl/camera.h中的此代码按预期工作的 相机类
根据本教程制作的鼠标射线类: https : //antongerdelan.net/opengl/raycasting.html
鼠标方向计算放入代码中(最后一个函数正确返回方向,因为我用锁定的相机对其进行了测试)(每次渲染都会更新):
glm::vec3 NormalizedDeviceCoordinates() {
float x = (2.f * this->mouseX) / this->frameBufferWidth - 1.0f;
float y = 1.0f - (2.0f * this->mouseY) / this->frameBufferHeight;
float z = 1.0f;
return glm::vec3(x, y, z);
}
glm::vec4 HomogeneousClipCoordinates(glm::vec3 NormalizedDeviceCoords) {
return glm::vec4(NormalizedDeviceCoords.x, NormalizedDeviceCoords.y, -1.f, 1.f);
}
glm::vec4 EyeCoordinates(glm::vec4 HomogenousClipCoords) {
glm::vec4 ray_eye = glm::inverse(projectionMatrix) * HomogenousClipCoords;
return glm::vec4(ray_eye.x, ray_eye.y, -1.f, 0.f);
}
glm::vec3 WorldCoordinates(glm::vec4 EyeCoords) {
glm::vec3 ray_wor = (glm::inverse(viewMatrix) * EyeCoords);
ray_wor = glm::normalize(ray_wor);
return ray_wor;
}
glm::vec3 calculateMouseRay() {
return WorldCoordinates(EyeCoordinates(HomogeneousClipCoordinates(NormalizedDeviceCoordinates())));
}
我还有一个键盘输入功能,我可以通过按 M 键在两种模式之间切换。解锁模式和锁定模式的区别:
glfwSetInputMode(this->window, GLFW_CURSOR, GLFW_CURSOR_DISABLED)
/glfwSetInputMode(this->window, GLFW_CURSOR, GLFW_CURSOR_NORMAL)
- 允许摄像机移动和旋转/不允许移动或摄像机旋转
问题:
我真的不知道如何描述它,所以我制作了一个视频并将其上传到 youtube。
这是链接: https ://youtu.be/4s-M6vHxvCc
现在,是时候解释一下了:
- 您看到的黑白立方体是我尝试跟踪方向射线的尝试,(简单地说,我绘制立方体并将变换矩阵发送到着色器,将其变换为相机位置+射线方向矢量),现在立方体显示在两者中模式(解锁和锁定)。
- 在视频的前半部分,我处于解锁模式。你可以看到我试图向左和向右旋转以试图表明立方体有点卡在这个角度并且不会超过它。
- 在视频的后半部分(立方体“捕捉”到位置后),我切换到锁定模式。您还可以看到我的光标以及立方体。它们没有对齐,但立方体实际上是在复制光标移动。(还值得指出的是光标和位置之间存在偏移,可能是由于之前的鼠标从解锁模式旋转,idk 如何解释)
可能的解决方案/原因/想法:
我对此并不完全确定,但我认为有不止一个问题重叠。
首先,我认为立方体以某种方式锁定在水平面上(无意中)。如果我用移动键移动,立方体会随着我移动,但每当我移动鼠标时,它总是沿着那个平面移动。
其次,它在逻辑上不应该是水平面,而是第一个屏幕被渲染到的平面(英语不是我的母语)。
第三,如果第二个假设是正确的,我需要根据鼠标旋转以某种方式移动这个平面(最好说相机方向),我不知道该怎么做(或者在什么时候我应该把它添加到方程中事实)。
后记:
您可能已经注意到视频前半部分(解锁模式)的问题。用视频游戏术语(这是一个假设)我同时工作的 fps 摄像头(通常在屏幕中间有“光标”)和某种菜单摄像头(跟踪实际光标位置) ,这很糟糕,因为我想要的是在屏幕中心(相机方向)绘制立方体,并且只有当我切换到(锁定模式)时,立方体才会根据光标位置开始移动。但是出于示例目的,您应该看到上面提到的另一个问题。
如果您需要更多信息,我将感谢任何可以回答问题或指出正确方向的人。