OpenGL3.3_C++_Windows(6)

添加一个Editor camera

  1. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  2. 原理:接受用户输入(鼠标,按键……),通过(callback / 内置API)获取差值 / 是否触发用户输入,更新唯一view的位置 (view的翻转矩阵),设定唯一的摄像机的projection矩阵,,作为所有物体的 视图投影 矩阵。
  3. Euler欧拉角和quad四元数基本概念:
    1. 俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll),分别绕xyz轴旋转
    2. 万向节死锁:参考视频
    3. quad避免死锁,xyzw四个参数
  4. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  5. 目标:按住alt,鼠标左键旋转,中键平移,右键旋转。接受滚轮缩放。WASD根据相机的局部坐标移动。
    private://投影矩阵(视野,宽高比,近平面和远平面)float m_FOV = 45.0f, m_AspectRatio = 1.778f, m_NearClip = 0.1f, m_FarClip = 1000.0f;//glm::mat4 m_ViewMatrix;//视图矩阵,glm::mat4 m_ProMatrix;//投影矩阵//glm::vec3 m_Position = { 0.0f, 0.0f, 0.0f };//计算后的新位置(平移的目标点 - 在相机的z方向上的距离)glm::vec3 m_FocalPoint = { 0.0f, 0.0f, 0.0f };//本次目标点//glm::vec2 m_InitialMousePosition = { 0.0f, 0.0f };//鼠标上一次位置//float m_Distance = 10.0f;//距离原点的距离//float m_Pitch = 0.0f, m_Yaw = 0.0f;//仰角和偏航角//float m_ViewportWidth = 1280, m_ViewportHeight = 720;//视口大小
  1. 实现:
    1. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
    2. 事件:
    3. 接受用户按键输入,新建input类,目的抽象出用户输入,bool函数((参数 int) GLFW__KEY…… || GLFW__MOUSE……):glfwGetKey(app中的窗口,int 参数)以此判断是否按下了int……键(键盘 || 鼠标)
    4. glfwGetCursorPos()获取当前鼠标位置
    5. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
    6. 函数:
    7. 抽象出EditorCamera类,目标:透视摄像机,接受用户输入,改变ViewMatrix
    8. 构造函数中初始ProMatrix,OnUpdate中if判断是否按下了按键,调用相应函数,计算出新的vec3(摄像机位置),并调用更新ViewMatrix
    9. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
    10. 旋转平移缩放:
    11. 旋转改变局部旋转成员变量,从而当wasd计算新的vec3向量时,新向量vec3 + = 速度(标量)* 局部的坐标轴(向量)vec3
    12. 对于滚轮的差值,需要从glfwSetScrollCallback()回调函数获取
    void EditorCamera::MouseScrolledEvent(GLFWwindow* window, double xOffset, double yOffset)
    1. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
    2. speed优化:
    3. 速度整体优化:计算时差。
    4. 对于平移速度,优化:把距离考虑distance 进去。
    5. 对于缩放距离优化: distance * distance平方函数:距离越大,移动越快,距离越小移动越慢
    6. 最后需要反转视图矩阵m_ViewMatrix = glm::inverse(m_ViewMatrix);我们摄像机是正常思维去变换的,那么实际传给glsl,改变物体位置,那么需要物体按照相反的方向移动
  1. /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
  2. LookAt()函数,实际上是一个内置矩阵,(不需要反转)
  3. 参数:相机位置、目标点和上向量
  4. 作用:计算viewMatrix
  5. 对于接受用户输入,改变相机当前的vec3位置向量,传入lookat函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极速查询:StarRocks 存算分离 Compaction 原理 调优指南

作者:丁凯,StarRocks TSC member/镜舟科技云原生技术负责人 StarRocks 在数据摄入过程中,每次操作都会创建一个新的数据版本。在查询时,为了得到准确的结果,必须将所有版本合并。然而,随着历史数据版本的累…

关于 MySQL 5.7 升级 8.0 时 INT 显示问题分析

本案例中的客户是从 MySQL 5.7.36 升级到 MySQL 8.0.35,升级完成后业务反馈表结构有变化,升级前某个表的字段数据类型为 INT(10),升级后变成了 INT,客户咨询有什么影响没有? 作者:张昊,DBA&…

JavaScript日期对象、DOM节点操作(查找、增加、克隆、删除)

目录 1. 日期对象2. DOM节点操作2.1 查找节点2.2 增加节点2.3 克隆节点2.4 删除节点 1. 日期对象 实例化日期对象: 获取当前时间: new Date()获取指定时间: new Date(2023-12-1 17:12:08) 日期对象方法: 方法作用说明getFullYear()获得年份获取四位年份getMonth…

logback-spring.xml 小记

为什么不用logback.xml 名字 加载顺序:logback.xml>application.yml>logback-spring.xml 使用xml中使用到配置文件属性时,就会报错 为什么logback中记录不到运行时报错 logback获取不到堆栈错误 解决办法:在全局错误出使用log.error()指定输出 为什么打印不出来myba…

五大API接口:提升你的应用性能与用户体验

引言: 简述API接口的重要性引入API接口对于提升应用性能和用户体验的贡献 API接口简介: 定义:解释什么是API接口作用:概述API接口在软件开发中的作用 1. 数据访问API 功能描述:提供快速、安全的数据存取功能提升性…

“首秀”欧洲杯,海信冰箱欧洲市占率居国产品牌首位

随着欧洲杯的火热开赛,挑灯夜战、观看球赛的时刻已经来临。此时,你需要何物相伴?是打开冰箱,取出真空腌制的食材,亲手烹饪一场观赛盛宴?还是取出极致保鲜的荔枝、樱桃,一边观赛一边品味&#xf…

部署yum仓库

目录 安装软件包 yum 配置文件 缓存功能操作步骤 创建并配置本地仓库文件 yum相关命令 yum install __ yum repolist yum list __ yum info __ yum search __ yum whatprovides __ yum remove __ yum -y update __ yum history yum grouplist yum groupinstall…

如何使用Vue3和ApexCharts轻松创建交互式图表

本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于Vue3的ApexCharts动态图表展示 应用场景 本代码段适用于在Vue3应用中使用ApexCharts库创建交互式、可视化的图表。这些图表可以用于展示各种数据,例如销售额、支出、利润等,从而帮…

Microsoft Store打不开解决办法

//卸载Microsoft Store Get-AppxPackage -alluser WindowsStore | Remove-AppxPackage //重装 Get-AppxPackage -AllUsers Microsoft.WindowsStore* | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “ ( ( (_.InstallLocation)\AppXManifest.xml”}

ARP攻击和DNS攻击有什么区别

ARP攻击和DNS攻击的明显区别 一、定义与原理 ARP攻击: 定义:ARP攻击(Address Resolution Protocol Attack)是局域网最常见的一种攻击方式,其基本原理是通过伪造ARP数据包来窃取合法用户的通信数据,造成影…

006 spring事务支持

文章目录 事务回顾事务介绍事务并发问题(隔离性导致)事务隔离级别 Spring框架事务管理相关接口Spring框架事务管理的分类编程式事务管理(了解)声明式事务管理(重点) 事务管理之XML方式业务层持久层单元测试代码配置事务管理的AOP 事务管理之混合方式事务管理之基于AspectJ的纯注…

不重新安装Anaconda找回不见的Anaconda Prompt

找回Anaconda Prompt只需三步 系统:win11 x641.cd Anaconda的安装目录2. Anaconda Prompt又回来了 系统:win11 x64 1.cd Anaconda的安装目录 winR 输入cmd 进入命令行,进入到Anaconda的安装目录 eg:我的Anaconda安装在&#xff…

一个简单的信号发射电路的构建

在基本的信号发射电路中,线圈(电感器)和电阻的组合可以产生振荡信号,而天线(通常通过线圈)用于发射信号。 LC振荡电路: **线圈(L1)和电容器(C)**串…

Ubuntu24多版本python解释器使用

1.前言 已给树莓派5安装了Ubuntu24.04,带有python3.12.3,现在用视觉需要用到3.11版本的python解释器 2.实操过程 主要是对用到的命令进行备份,方便后面查询 2.1 安装python3.11 sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-ge…

App分发苹果ios内测ipa应用文件签名分发平台剖析

一、 应用分发下载速度为何快速 App内测签名分发平台能够提供快速的应用分发下载速度,主要有以下几个原因:提供的服务器带宽资源大。这些平台通常采用高性能服务器,并且拥有强大的带宽资源,能够支持高并发下载。 采用分布式技术…

MySQL:emoj表情录入

在实际开发中有时候会获取第三方授权头像的时候,头像包含了emoj表情,但是存到数据库出现乱码的情况,那这种情况我们如何处理呢? 解决方法: [client] default-character-set utf8mb4 [mysql] default-character-set…

底价竞拍成功,兴业法拍网何淑帅助高先生圆梦三居~

今日我们荣幸地向大家宣告一条喜讯。三部法拍经理何淑帅以其卓越的能力与竭诚的服务态度,成功助力高先生起拍价成交顺义裕龙六区的一套三居室。 高先生经朋友介绍与三部经理何淑帅结缘,他本身对该小区有所知晓,且正好在周边工作,何…

2.什么是计算机程序

什么是计算机程序? 计算机程序是为了告诉计算机"做某件事或解决某个问题"而用"计算机语言编写的命令集合(语句) 只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作,计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成 现实生活中你如…

JVM 基本组成

一、为什么要学习 JVM ? 1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点; 2. 未来在⼯作场景中,也许你会遇到以下场景: 线上系统突然宕机,系统⽆法访问,甚⾄直…

在向量数据库中存储多模态数据,通过文字搜索图片

在向量数据中存储多模态数据,通过文字搜索图片,Chroma 支持文字和图片,通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。 OpenClip CLIP(Contrastive Language-Image Pretraining&…