微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

相机和鼠标选择困难

如何解决相机和鼠标选择困难

我正在开发 3D 空间中的国际象棋游戏。我试图弄清楚如何移动人物,但相机和不同的鼠标模式让我头疼。

这是一个示例屏幕截图:

Example

想法:

有两种相机/鼠标输入模式,一种让我在空间中自由移动并环顾四周(简称解锁相机/fps相机),另一种锁定屏幕,我不能移动鼠标移动不会旋转视图(锁定相机/某种没有菜单菜单相机)。在锁定模式下,我将能够选择棋子下的方块,并通过投射到场景中的光线将它们移动到不同的方块到我的光标位置。

我有什么:

Camera class 根据来自 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,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 键在 2 种模式之间切换。解锁和锁定模式的区别:

  • glfwSetInputMode(this->window,GLFW_CURSOR,GLFW_CURSOR_disABLED) / glfwSetInputMode(this->window,GLFW_CURSOR_norMAL)
  • 允许相机移动和旋转/不允许移动或相机旋转

问题

我真的不知道如何描述它,所以我制作了一个视频并将其上传到 youtube。

链接如下: https://youtu.be/4s-M6vHxvCc

现在是解释的时候了:

  • 你看到的黑白立方体是我试图追踪 方向射线,(简单地说,我绘制立方体并发送变换 矩阵到着色器,将其转换为相机位置 + 射线 方向向量),现在立方体以两种模式显示(解锁 并锁定)。
  • 在视频的前半部分,我处于解锁模式。你可以看到我试图旋转到 左右试图显示立方体有点卡住 在这个角度,不会超过它。
  • 在视频的后半部分(在立方体“捕捉”到位置之后)我切换到锁定模式。您还可以看到我的光标以及立方体。它们没有对齐,但立方体实际上是在复制光标移动。 (还值得指出的是,光标和位置之间存在偏移,可能是由于之前鼠标从解锁模式旋转所致,不知道如何解释)

可能的解决方案/原因/想法:

我不完全确定这一点,但我认为有不止一个问题重叠。

首先我认为立方体以某种方式锁定在水平面(无意中)。如果我用移动键移动,立方体会随着我移动,但每当我移动鼠标时,它总是沿着那个平面移动。

其次,从逻辑上讲,它不应该是水平面,而是呈现第一个屏幕的平面(英语不是我的母语)。

第三,如果第二个假设是正确的,我需要根据鼠标旋转(最好说相机方向)以某种方式移动这个平面,我不知道该怎么做(或者此时我应该将其添加到等式中)事实上完全没有)。

后记:

您可能已经注意到视频前半部分(解锁模式)的问题。用视频游戏术语(这是一个假设)我同时使用 fps 相机(通常在屏幕中间有“光标”)和某种菜单相机(跟踪实际光标位置) ,这很糟糕,因为我想要的是在屏幕中心(相机方向)绘制的立方体,并且只有当我切换到(锁定模式)时,立方体才会根据光标位置开始移动。但出于示例目的,您应该看到上面提到的另一个问题。

如果您需要更多信息,我将不胜感激任何可以回答问题或为我指明正确方向的人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。