OpenGL调用窗口,方向键和鼠标
9.2 OpenGL调用窗口,方向键和鼠标
9.2.1 opengl调用窗口
OpenGL调用窗口步骤:
第一步:初始化 GLFW,初始化OpenGL,初始化窗口,初始化上下文
第二步:设置窗口大小和位置,设置输入输出
第三步:循环渲染
第四步:终止
示例代码:
#include <glew.h>
#include <glfw3.h>
#include <iostream>void processInput(GLFWwindow* window)
{if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}int main()
{//第一步:初始化glfw,glfwInit();//初始化glfw//glfwWindowHint初始化glfw的版本glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//主版本glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//次版本glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//配置glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//mac上使用//初始化窗口GLFWwindow* window = glfwCreateWindow(800, 600, "learnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}//初始化上下文glfwMakeContextCurrent(window); //将主线程设置为当前渲染环境//Init GLEWglewExperimental = true;if(glewInit() != GLEW_OK){printf("Init GLEW failed.");glfwTerminate();return -1;}//第二步:设置窗口大小和位置glViewport(0, 0, 800, 600);//前两个参数窗口左下角的位置。后两个渲染窗口的宽度和高度while (!glfwWindowShouldClose(window)){processInput(window); ///设置输入输出glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//前面三个参数是RGB,后面一个参数是透明度glClear(GL_COLOR_BUFFER_BIT);glfwSwapBuffers(window);//函数在每次循环迭代开始时检查 GLFW 是否已被指示关闭glfwPollEvents();//函数检查是否触发了任何事件}glfwTerminate();//第四步:清理return 0;
}
9.2.2 opengl 调用方向键
调用方向键主要是考虑按键和移动速度,修改的办法是在上面调用窗口的设置函数processInput上进行修改;
void processInput(GLFWwindow *window)
{...const float cameraSpeed = 0.05f; // adjust accordinglyif (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)//按下W键cameraPos += cameraSpeed * cameraFront;//cameraFront相机超向if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)//按下S键cameraPos -= cameraSpeed * cameraFront;if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)//按下A键cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)//按下D键cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
}
9.2.3 opengl调用鼠标
OpenGL 调用鼠标主要考虑鼠标的移动和缩放,主要是使用下面3个函数:
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //隐藏并捕获光标
void mouse_callback(GLFWwindow* window, double xpos, double ypos);//监听鼠标移动事件xpos和ypos代表当前鼠标位置
glfwSetCursorPosCallback(window, mouse_callback)
计算鼠标光标步骤:
- 计算鼠标自上一帧以来的偏移量。
- 将偏移值添加到相机的偏航和俯仰值中。
- 为最小/最大音高值添加一些约束。
- 计算方向向量。
代码:
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{if (firstMouse)// initially set to true,保证初次使用不会大幅度跳跃{lastX = xpos;lastY = ypos;firstMouse = false;}float xoffset = xpos - lastX;float yoffset = lastY - ypos; lastX = xpos;lastY = ypos;float sensitivity = 0.1f; //乘以灵敏度值,降低鼠标移动太剧烈xoffset *= sensitivity;yoffset *= sensitivity;yaw += xoffset;//偏移值加入俯仰pitch += yoffset;//偏移值加入偏航if(pitch > 89.0f)///加入约束pitch = 89.0f;if(pitch < -89.0f)pitch = -89.0f;glm::vec3 direction;//计算实际方向向量direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));direction.y = sin(glm::radians(pitch));direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));cameraFront = glm::normalize(direction);
}
(2)鼠标缩放
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{fov -= (float)yoffset;if (fov < 1.0f)fov = 1.0f;if (fov > 45.0f)fov = 45.0f;
}projection = glm::perspective(glm::radians(fov), 800.0f / 600.0f, 0.1f, 100.0f);
glfwSetScrollCallback(window, scroll_callback);
相关文章:
OpenGL调用窗口,方向键和鼠标
9.2 OpenGL调用窗口,方向键和鼠标 9.2.1 opengl调用窗口 OpenGL调用窗口步骤: 第一步:初始化 GLFW,初始化OpenGL,初始化窗口,初始化上下文 第二步:设置窗口大小和位置,设置输入输出 第三步…...
fastAdmin表格列表的功能
更多文章,请关注:fastAdmin后台功能详解 | 夜空中最亮的星 FastAdmin是一款基于ThinkPHP5Bootstrap的极速后台开发框架。优点见开发文档 介绍 - FastAdmin框架文档 - FastAdmin开发文档 在这里上传几张优秀的快速入门图: 一张图解析FastAdmin中的表格列…...
用来检查 CUDA、Conda 和 PyTorch 的版本的python文件
提供的 Python 代码片段包括几个语句,用来检查 CUDA、Conda 和 PyTorch 的版本,以及一些与 CUDA 相关的系统配置。让我们分解一下:PyTorch 版本和配置:torch.__config__.show():显示 PyTorch 的构建配置。 torch.__ver…...
基于Redisson,实现分布式锁注解
1.原始写法 我们平常使用redisson的分布式锁是不是基本都用下面的这个模板,既然是模板,那为何不把他抽出来呢? // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁 boolean res lock.tryLock(100, 10, TimeUnit.SECON…...
【机器学习】机器学习是什么?
你知道机器学习是什么吗?它就像是一个超级聪明的孩子,可以通过观察和经验不断学习和成长。而我们要做的就是培养和教育这个孩子,让他能够从数据中学习并做出决策和预测。 那么,我们该如何培养和教育这个聪明的孩子呢?首…...
一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人
一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络(CNN):细致的艺术学徒生成对抗网络(GAN):画家与评审的双重角色…...
C# 中的执行表达式树(Expression Tree)
引言: 在C#编程中,表达式树(Expression Tree)是一种强大的工具,用于表示和执行计算表达式。表达式树将计算表达式抽象为树状结构,每个节点代表表达式中的一个元素,如常量、变量、方法调用等。本…...
森林监测VR虚拟情景再现系统更便利
AI人工智能技术已经逐渐渗透到各个领域,为我们的生活带来了诸多便利。在虚拟仿真教学领域,AI技术的应用也日益丰富,为虚拟情景交互体验带来了前所未有的好处。 提高VR虚拟情景的逼真度 通过深度学习和计算机视觉等技术,AI/VR虚拟现…...
高频面试题整理(一)
文章目录 平台无关性如何实现?JVM如何加载 .class文件?什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器:Java虚拟机栈局部变量表和操作数栈: Java内存模型中堆和栈的区别…...
2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类
文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…...
基础!!!吴恩达deeplearning.ai:卷积层
以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 回顾——密集层 Dense Layer卷积层 Convolutional Neural Network定义优势具体说明心电图卷积层搭建 到目前为止,你使用的所有神经网络层都是密集层类型,这…...
SpringBoot案例(黑马学习笔记)
这个案例呢,就是Tlias智能学习辅助系统。 参考接口文档完成后端功能的开 发,然后结合前端工程进行联调测试即可。 完成后的成品效果展示: 准备工作 需求&环境搭建 需求说明 部门管理 部门管理功能开发包括: ● 查询部门列…...
项目流程图
实现便利店自助付款项目 服务器: 1、并发服务器(多进程、多线程、IO多路复用) 2、SQL数据库的创建和使用(增删改查) 3、以模块化编写项目代码,按照不同模块编写.h/.c文件 客户端: 1、QT客户端界…...
鸿蒙这么大声势,为何迟迟看不见岗位?最新数据来了
对于鸿蒙生态建设而言,2024年可谓至关重要,而生态建设的前提,就是要有足够的开发人才。与之对应的,今年春招市场上与鸿蒙相关岗位和人才旺盛的热度,一方面反应了鸿蒙生态的逐渐壮大,另一方面也让人们对鸿蒙…...
Qt中关于信号与槽函数的思考
信号与槽函数的思考 以pushbutton控件为例,在主界面上放置一个pushbutton控件,点击右键选择关联槽函数,关联一个click函数,如下图所示: 在该函数中,实现了一个点击pushbutton按钮后,弹出一个窗…...
项目技术栈-解决方案-消息队列
项目技术栈-解决方案-消息队列 概念应用场景1. 异步处理 参考文章消息队列(Message Queue) 概念 “消息”是在两台计算机间传送的数据单位。 消息可以非常简单,例如只包含文本字符串; 也可以更复杂 ,包括对象等。 队…...
【深度优先搜索】【图论】【推荐】332. 重新安排行程
作者推荐 动态规划的时间复杂度优化 本文涉及知识点 深度优先搜索 图论 LeetCode332. 重新安排行程 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&a…...
DAY9-防病毒AV概述
DNS过滤 URL过滤和DNS过滤对比...
TCP缓存
TCP缓存是指TCP协议在数据传输过程中使用的一种机制,用于临时存储和管理数据包。它主要有三个作用:提高网络性能、保证数据的可靠性和实现流量控制。 首先,TCP缓存可以提高网络性能。当发送端发送数据时,TCP协议会将数据分割成若…...
Socket网络编程(一)——网络通信入门基本概念
目录 网络通信基本概念什么是网络?网络通信的基本架构什么是网络编程?7层网络模型-OSI模型什么是Socket?Socket的作用和组成Socket传输原理Socket与TCP、UDP的关系CS模型(Client-Server Application)报文段牛刀小试(TCP消息发送与接收&#…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...
