glfw 相关问题

GLFW是一个免费的开源多平台库,用于打开窗口,创建OpenGL上下文和管理输入。它很容易集成到现有的应用程序中,并没有声称主循环。 GLFW是用C语言编写的,并且对Windows,Mac OS X以及使用X Window系统的许多类Unix系统(例如Linux和FreeBSD)提供原生支持。 GLFW根据zlib / libpng许可证授权。

如何修复按键回调函数和 glfwSetKeyCallback 之间的参数类型不匹配问题?

我创建了一个包含 std::map 的键盘映射的 Camera 类 我创建了一个 Camera 类,其中包含 std::map<int, void(Camera::*)() 的键盘映射,以方便游戏中的键绑定选项和比使用 switch 语句可以完成的更高性能的键操作查找。 我无法使用 glfwSetKeyCallback 函数从键盘映射访问操作功能,并且我一直遇到 keyCallback 函数和 GLFWkeyfun 之间的签名不匹配的情况。 这是Camera课程: class Camera { Camera(); private: void Mouse_Input(); void Joystick_input(); void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods); void forward() { position += velocity * Orientation; } void backward() { position -= velocity * Orientation; } void left() {// Left position -= velocity * glm::normalize(glm::cross(Orientation, Up)); } void right() { position += velocity * glm::normalize(glm::cross(Orientation, Up)); } void up() { position += velocity * Up; } void down() { position -= velocity * Up; } void sprint() { velocity *= 2.f; } void noclip() { noClip = !noClip; if (!noClip) { gravity(position, velocity); } } void close() { glfwSetWindowShouldClose(Window::handle, true); } public: alignas(16) glm::mat4 view; alignas(16) glm::mat4 proj; alignas(16) glm::vec3 position; void update(float FOVdeg, float nearPlane, float farPlane); protected: bool noClip = true; bool firstClick = true; float velocity = 0.05f; float sensitivity = 1.75f; glm::vec3 Orientation; glm::vec3 Up; using pfunc = void (Camera::*)(); std::map<int, pfunc> keyboard_map { { GLFW_KEY_W, &Camera::forward }, { GLFW_KEY_A, &Camera::left }, { GLFW_KEY_S, &Camera::backward }, { GLFW_KEY_D, &Camera::right }, { GLFW_KEY_SPACE, &Camera::up }, { GLFW_KEY_LEFT_CONTROL, &Camera::down }, { GLFW_KEY_LEFT_SHIFT, &Camera::sprint }, { GLFW_KEY_V, &Camera::noclip }, { GLFW_KEY_ESCAPE, &Camera::close } }; }; 这些是我的 cpp 文件中的相关函数定义: void Camera::keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods) { if (!GLFW_PRESS | !GLFW_REPEAT) { return; } auto afunc = keyboard_map[key];//gets camera action function from map (this->*afunc)();//executes action function } void Camera::update(float FOVdeg, float nearPlane, float farPlane) { if (glfwJoystickPresent(GLFW_JOYSTICK_1)) {//Check for joystick std::jthread t_Console([&] { Joystick_input(); }); } std::jthread t_PC([this] { glfwSetKeyCallback(Window::handle, &Camera::keyCallBack); }); //Line causing the error std::jthread t_mouse([&] { Mouse_Input(); }); if (!noClip) { gravity(position, velocity); } view = glm::lookAt(position, position + Orientation, Up); proj = glm::perspective(glm::radians(FOVdeg), (float)GPU::Extent.width / GPU::Extent.height, nearPlane, farPlane); proj[1][1] *= -1; } 我尝试了这个解决方案,它允许我编译程序,但是在调用 auto afunc = keyboard_map[key]; 函数的 keyCallBack 行时,程序崩溃了,但没有产生错误代码。 std::jthread t_test([this]() { glfwSetKeyCallback(Window::handle, [](GLFWwindow* window, int key, int scancode, int action, int mods) { auto* instance = static_cast<Camera*>(glfwGetWindowUserPointer(window)); if (instance) { instance->keyCallBack(window, key, scancode, action, mods); } }); } ); 我完全找不到这个问题的解决方案。有人可以帮助我理解为什么我的原始方法中存在签名不匹配,为什么访问地图会导致我尝试的其他方法崩溃,以及如何让此设置按预期工作? 编辑:错误:“void(Camera::*)(GLFWwindow* window, int key, int scancode, int action, int mods)类型的参数与GLFWkeyfun类型的参数不兼容” 您正在尝试为您的 glfwSetKeyCallback() 回调使用非静态类方法。这是行不通的,因为 glfwSetKeyCallback() 需要一个 C 风格的函数指针。因此,您必须: 使 keyCallBack() 保持静态 从 keyCallBack() 类中完全删除 Camera 并将其设为独立函数 正如您所发现的,使用非捕获 lambda。 无论哪种方式,正如您已经知道的,您都可以使用 glfwSetWindowUserPointer() 将 Camera* 指针存储到 GLWindow 中,然后在回调中使用 glfwGetWindowUserPointer() 返回到 Camera 对象。但是,您显示的代码没有在任何地方调用 glfwSetWindowUserPointer()。

回答 1 投票 0

直接体渲染纹理重叠伪影

我正在尝试在 Chai3D 中使用直接体积渲染,但是有一个伪影使托管边界网格的边缘始终可见,即使在其前面有另一个对象也是如此......

回答 1 投票 0

GLFW 库无法使用 bgfx 初始化

我只是想用glfw学习bgfx,我的代码确实可以编译,但是当我尝试运行该程序时,我遇到了一些错误 #定义WDW_WIDTH 1280 #定义WDW_HEIGHT 720 #定义GLFW_INCLUDE_NONE #如果

回答 1 投票 0

用鼠标按钮旋转相机而不重置?

我想使用鼠标按钮使相机旋转。 相机旋转得很好,但问题出在鼠标按钮上。当我释放鼠标按钮并再次按下时,旋转会重置...

回答 1 投票 0

glfw3.dll 运行代码时未找到系统错误

我已经在 Visual Studio Code(代码编辑器,而不是 IDE)中设置了 GLFW。当我运行代码时,它给我一个系统错误:-找不到glfw3.dll。 这是我从 GL 文档中复制的代码...

回答 1 投票 0

使用 Bullet 物理和纹理时出现 C++ 错误

TextureLoader:文件名/root/SourceCodes/CPP/Assets/Textures/globe.jpg malloc():无效大小(未排序) 当我尝试运行这个时: // 需要首先包含 GLEW #包括 // G...

回答 1 投票 0

GLEW初始化问题导致程序无法输出

我在尝试将 GLEW 库用于我的基本 OpenGL 程序时遇到问题,该程序是使用 GLFW (glfw3.h) 编写的。一切编译都没有错误,但是一旦我调用 glewIni...

回答 1 投票 0

Visual Studio 2022 找不到 glfw.dll,即使该库已链接到项目中

首先,我是 Visual Studio 2022 的新手,我现在唯一的目标是运行我在 github 上找到的代码。说明非常简单: 下载 .sln 文件 安装需要的依赖项 跑...

回答 1 投票 0

C++/xcode15/MacOs14.0 - glClear(GL_COLOR_BUFFER_BIT); - 线程1:EXC_BAD_ACCESS(代码=1,地址=0x0)

我环顾四周,显然我可以在这个解决方案之间进行选择,而我的问题与以下相同: 文本, 但我仍然不知道如何解决这个问题。 当我使用 glClear(

回答 1 投票 0

Xcode:GLFW / GLAD 默认 C 应用程序中的“线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)”

我是 GLFW 的新手,我尝试用 C 语言使用 GLFW 和 OpenGL 制作最基本的应用程序。我从 GLFW 文档中获取了示例代码:https://www.glfw.org/documentation.html。有效。

回答 2 投票 0

在 Macos xcode 中使用 GLFW 并显示:“'GLFW/glfw3.h' 文件未找到”

我已经将glfw文件获取到xcode库,但仍然失败 “找不到...文件”,为什么?在此处输入图像描述在此处输入图像描述 我该怎么办,...

回答 1 投票 0

OpenGL - 未使用颜色和顶点的动态数组生成三角形

#包括 #包括 #包括 #包括 #包括 #包括 #包括 // 顶点 Sha...

回答 1 投票 0

将鼠标坐标转换为世界空间坐标

我正在使用 GLFW,我想通过窗口上的鼠标坐标获取世界空间坐标,以在单击选定位置时绘制对象。首先,我试图仅使用

回答 2 投票 0

在 Imgui 中如何使用 glfw 处理一般鼠标事件?

我使用glfw回调函数来用鼠标移动相机。 鼠标回调函数为: void mouse_callback(GLFWwindow *窗口, 双 xposIn, 双 yposIn) { 如果(被按下) { ...

回答 4 投票 0

如何在 Zig 中投射指针

我正在尝试用 Zig 重写一个 Hello 三角形,但是我遇到了一些问题。我无法使用指针强制转换。 fn framebufferResizeCallback(window: ?*cInclude.GLFWwindow, _: c_int, _: c_int) callconv(.C) vo...

回答 1 投票 0

Zig Lang 选角

我正在尝试在 Zig Lang 中重写 Hello 三角形,但我遇到了一些问题。我无法使用指针强制转换。 fn framebufferResizeCallback(窗口: ?*cIninclude.GLFWwindow, _: c_int, _: c_int) callconv(.C) ...

回答 1 投票 0

OpenGL场景渲染失败?

我需要在 OpenGL 中创建一盏带有杆子和支架的灯。我需要对对象的每个顶点使用至少 2 个原始形状和不同的颜色。 由于某种原因,没有任何渲染。什么是...

回答 1 投票 0

glfwSetCharCallback 不接受我的函数签名

制作了一个GLFW窗口。尝试设置用户输入。我使用(看似)正确的参数调用“glfwSetCharCallback”。最后一个参数是一个应该被计算的函数...

回答 1 投票 0

防止光标移动到GLFW窗口边界之外?

我使用 OpenGL 和 C,窗口使用 GLFW。我已启用 glfwSetInputMode(window.self, GLFW_CURSOR, GLFW_CURSOR_DISABLED); 但光标没有锁定,并移到窗口之外,

回答 1 投票 0

OpenGL 渲染循环如何工作以及如何正确计算 FPS?

我尝试在渲染循环中计算 FPS,如下所示: while (!glfwWindowShouldClose(窗口)) { 浮点电流 = (浮点) glfwGetTime(); delta = 当前 - 时间; 时间=当前; std::co...

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.