- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了 GLFW 和拖动鼠标的问题。该程序无法获取 Linux 上鼠标的位移。我需要你的帮助,因为在 Windows 上它是有效的。是软件问题吗?
有代码:
//SEED INCLUDES
#include <Seed/Graphics/engine/engine.hpp>
Engine::Engine()
{
initLog();
}
Engine::~Engine()
{
// Close OpenGL window and terminate GLFW
glfwTerminate();
TwTerminate();
}
void Engine::mainRender(std::shared_ptr<Scene> scene)
{
double currentTime = 0, lastTime = 0;
float deltaTime = 0;
glfwSetCursorPos(window, WIDTH / 2, HEIGHT / 2);
//get all the nodes with a model
std::stack<ObjectNode*> n;
std::vector<ObjectNode*> nodes;
n.push(scene->getRootObjectNode());
while (!n.empty())
{
ObjectNode *n2 = n.top();
n.pop();
for (int i = 0; i < n2->getChildren()->size(); i++)
{
n.push(n2->getChildren()->at(i));
}
if (n2->getModel())
{
nodes.push_back(n2);
}
}
//glfwWaitEvents();
//glfwSwapInterval(0.1);
//glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
//main loop to render
do
{
// Clear the depthbuffer and the colourbuffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Black background
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
//get events glfw
glfwPollEvents();
//get current time
currentTime = glfwGetTime();
//update mouse control and keyboard control
this->controller->updateControl(this->window, scene->getCamera(), deltaTime);
//node->getMaterial()->setLight(a, d, s);
scene->render(nodes);
//scene->ShadowMappingRender();
//scene->SSAOrender();
//Draw anttweakbar
TwDraw();
//get current time
lastTime = glfwGetTime();
//time between 2 frames
deltaTime = float(lastTime - currentTime);
//on nettoie les buffers
glfwSwapBuffers(this->window);
} while (glfwGetKey(this->window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(this->window) == 0);
}
bool Engine::initSystem()
{
// Initialise GLFW
if (!glfwInit())
{
std::cout << "Failed to initialize GLFW" << std::endl;
return false;
}
//glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don't want the old OpenGL
window = glfwCreateWindow(WIDTH, HEIGHT, "Moteur3d", NULL, NULL);
if (window == NULL){
std::cout << "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" << std::endl;
glfwTerminate();
return false;
}
glfwMakeContextCurrent(window); // Initialize GLEW
glewExperimental = GL_TRUE; // Needed in core profile
if (glewInit() != GLEW_OK) {
std::cout << "Failed to initialize GLEW, version of opengl must be greater or equal than opengl 3.2\n" << std::endl;
return false;
}
return true;
}
bool Engine::initController()
{
this->controller = new Controller(this->window);
return true;
}
void TW_CALL CallbackButtonReset(void *clientData)
{
SPH::reset = true;
}
void TW_CALL CallbackButtonNextFrame(void *clientData)
{
SPH::nextFrame = true;
}
void TW_CALL CallbackButtonPlay(void *clientData)
{
SPH::play = true;
}
void TW_CALL CallbackButtonPause(void *clientData)
{
SPH::play = false;
}
和 Controller :
//SEED INCLUDES
#include <Seed/Graphics/engine/control.hpp>
#include <Seed/Graphics/engine/scene.hpp>
#include <Seed/Graphics/engine/camera.hpp>
int Controller::context = 0;
Controller::Controller(GLFWwindow *window)
{
//captur keys
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
glfwSetMouseButtonCallback(window, mouse_buttonID_callback);
this->context = 0;
glfwSetCursorPos(window, WIDTH / 2, HEIGHT / 2);
}
Controller::~Controller()
{
}
void Controller::updateControl(GLFWwindow* window, Camera *cam, float deltaTime)
{
//position of the camera
glm::vec3 position = cam->getPosition();
//horizontal and vertical angle
float WAngle = cam->getWAngle();
float HAngle = cam->getHAngle();
//field of view
const float initFoV = cam->getInitFoV();
float near = cam->getNear();
float far = cam->getFar();
//speed move direction (keyboard)
float speed = cam->getSpeed();
//speed view direction (mouse)
float mouseSpeed = cam->getMouseSpeed();
float FoV = cam->getInitFoV();
glm::vec3 direction;
glm::vec3 up;
/*if (glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS)
{
Controller::context += 1;
Controller::context %= 2;
}*/
double xpos, ypos;
//get mouse position on the screen
glfwGetCursorPos(window, &xpos, &ypos);
if (Controller::context == 0)
{
//reset position of mouse
glfwSetCursorPos(window, WIDTH / 2, HEIGHT / 2);
//compute angles
WAngle += mouseSpeed * float(WIDTH / 2 - xpos);
HAngle += mouseSpeed * float(HEIGHT / 2 - ypos);
//get direction of the camera
direction = glm::vec3(cos(HAngle) * sin(WAngle), sin(HAngle), cos(HAngle) * cos(WAngle));
//get right direction of the camera
glm::vec3 right(sin(WAngle - 3.14f / 2.0f), 0, cos(WAngle - 3.14f / 2.0f));
//get the up direction of the camera
up = glm::normalize(glm::cross(right, direction));
if (glfwGetKey(window, GLFW_KEY_KP_3) == GLFW_PRESS)
{
position += direction * speed;
}
else if (glfwGetKey(window, GLFW_KEY_KP_1) == GLFW_PRESS)
{
position -= direction * speed;
}
else if (glfwGetKey(window, GLFW_KEY_KP_6) == GLFW_PRESS)
{
position += right * speed;
}
else if (glfwGetKey(window, GLFW_KEY_KP_4) == GLFW_PRESS)
{
position -= right * speed;
}
else if (glfwGetKey(window, GLFW_KEY_KP_8) == GLFW_PRESS)
{
position += up * speed;
}
else if (glfwGetKey(window, GLFW_KEY_KP_2) == GLFW_PRESS)
{
position -= up * speed;
}
//set the angle of the direction vector of the camera
cam->setHAngle(HAngle);
cam->setWAngle(WAngle);
//update ViewMatrix
cam->setViewMatrix(position, direction, up);
//update Projection Matrix
cam->setProjectionMatrix(FoV, WIDTH, HEIGHT, near, far);
}
else
{
//send position of the mouse to anttweakbar
TwMouseMotion(xpos, ypos);
if (glfwGetKey(window, GLFW_KEY_KP_0) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_0, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_1) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_1, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_2) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_2, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_3) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_3, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_4) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_4, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_5) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_5, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_6) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_6, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_7) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_7, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_8) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_8, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_9) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_9, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_KP_ENTER) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_KP_ENTER, GLFW_PRESS);
}
else if (glfwGetKey(window, GLFW_KEY_DELETE) == GLFW_PRESS)
{
TwEventKeyGLFW(GLFW_KEY_DELETE, GLFW_PRESS);
}
}
}
void mouse_buttonID_callback(GLFWwindow* window, int button, int action, int mods)
{
//if action is press button
if (action == GLFW_PRESS)
{
//we get the right and left button of the souris to send these to anttweakbar
switch (button)
{
case GLFW_MOUSE_BUTTON_LEFT:
TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_LEFT);
break;
case GLFW_MOUSE_BUTTON_RIGHT:
Controller::context += 1;
Controller::context %= 2;
//Controller::context = 0;
TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_RIGHT);
break;
}
}
//if user release button we do the same thing that above
else if (action == GLFW_RELEASE)
{
switch (button)
{
case GLFW_MOUSE_BUTTON_LEFT:
TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_LEFT);
break;
case GLFW_MOUSE_BUTTON_RIGHT:
//Controller::context = 1;
TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_RIGHT);
break;
}
}
}
void Controller::initAntWeakBar(std::string name)
{
//initialisation AntWeakBar
TwInit(TW_OPENGL_CORE, NULL);
//windows size for anttweakbar
TwWindowSize(WIDTH, HEIGHT);
//initialize bar
this->bar = TwNewBar(name.c_str());
}
TwBar* Controller::getBar()
{
return this->bar;
}
你有解决办法吗?
最佳答案
好的,和windows的区别是以下原因:在 Linux 上,如果光标已移动,则必须使用条件。
glfwGetCursorPos(window, &xpos, &ypos);
if(mouse_moving)
{update}
在 Windows 上,只需移动光标的新位置即可,但在 Linux 上不行。
glfwGetCursorPos(window, &xpos, &ypos);
{update}
关于linux - GLFW 鼠标、Linux 和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34881822/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!