gl-Camera

news2024/11/23 20:20:25

我的服务原文访问:Camera

1.创建摄像机的坐标系,(创建原理,两条直线求其法向量)

Z轴:在世界坐标中指向摄像机的向量(D)

X轴:随便找一个向上量和Z向量求出的法向量就是X轴(R)

Y轴 :Z和X的法向量(U)

理解:如在一个2D的直角坐标系中x轴,y轴,在创建一个相对的直角坐标系,画一条直线a,在画一条垂直于直线a的垂线  

   b,则(a,b)就是一个坐标系,(a,b)就是摄像机。转换到3D也是一样。            

2.把世界坐标经过转换矩阵变换到摄像机坐标

a.推到思想:参考 图形学:观察矩阵/LookUp矩阵的推导 - 知乎

摄像机坐标 = 世界坐标 x 旋转矩阵 x 位移矩阵

摄像机坐标 = 世界坐标 x VM (变换矩阵)

VM  = RM  *  TM

TM :位移矩阵很简单,就是世界坐标指向相机坐标向量相反,很容易得到。

RM :旋转矩阵要矩阵的方程来计算,也旋转反向

3.摄像机位移说明,蓝色摄像机坐标

a1.世界坐标表示相机坐标,下图摄像机在世界坐标的a向量的地方

a2.摄像机坐标表示世界坐标,摄像机表示坐标世界坐标是a向量的相反向量

     动画太大请问访问:https://stanserver.cn/image/gallery/2022_12_23_19_22_43_131.gif

a3.相当于摄像机不动,世界相对于摄像机相反方向移动,如下图

     动画太大请问访问:https://stanserver.cn/image/gallery/2022_12_23_19_42_11_039.gif

求解摄像机位移坐标思想,是求解摄像机在世界坐标的反向量

4.摄像机旋转说明,蓝色摄像机坐标

  a1.摄像机相对世界坐标旋转一个角度b

      

 a2.摄像机坐标来看,相当于世界坐标旋转-b角度   

      

4.旋转矩阵推到过程

  参考: 图形学:观察矩阵/LookUp矩阵的推导 - 知乎

             p 6.6 逆矩阵

现设:

相机坐标原点和世界坐标原点重合没有位移,

WM世界坐标轴,并且向量单位向量矩阵

VM是摄像机的坐标轴,

RM未知旋转矩阵,使得WM世界坐标轴 和 VM是摄像机的坐标轴相等

如图:求旋转矩阵-b,相当于把摄像机坐标旋转到世界坐标(0,0,0)重合

可得矩阵方程:

WM = RM * VM

  两边同时右乘RM 的逆矩阵R-1M :

R-1M   *  WM = R-1M  * RM * VM

(R-1M  * RM )是单位矩阵,矩阵和单位矩阵相乘还是它本身,则有:

R-1M   *  WM = VM  

因为WM 是单位矩阵,则有:

R-1M = VM

因为VM直角坐标系,他的逆矩阵等于他转置

RM = V-1M

结论:旋转变换矩阵就是摄像机矩阵的转置

5.gl代码书写

a.创建投影矩阵

//创建投影矩阵
glm::mat4 projection    = glm::mat4(1.0f);//单位矩阵初始化
projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
ourShader.setMat4("projection", projection);

b.一个摄像机位置,一个目标位置和一个表示世界空间中的上向量

//glm::LookAt函数需要一个位置、目标和上向量。它会创建一个和在上一节使用的一样的观察矩阵。
view = glm::lookAt(glm::vec3(camX, 0.0f, camZ), 
                   glm::vec3(0.0f, 0.0f, 0.0f), 
                   glm::vec3(0.0f, 1.0f, 0.0f));
ourShader.setMat4("view", view);

c.把模型放到世界坐标系中

 //把模型放到世界中  计算每个对象的模型矩阵,并在绘图前将其传递给着色器
 glm::mat4 model = glm::mat4(1.0f);
 model = glm::translate(model, cubePositions[i]);//模型位置
 float angle = 20.0f * i;
 model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));//模型旋转
 ourShader.setMat4("model", model);
 glDrawArrays(GL_TRIANGLES, 0, 36);

6.Camera封装

a.观察者矩阵  前来两个向量确定方向向量,第三个参数是向上向量,方向和向上的向量计算摄像机的xyz轴

  view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);

b.摄像机前后移动

cameraPos += cameraSpeed * cameraFront;
cameraPos -= cameraSpeed * cameraFront;

c.摄像机左右移动 向量叉乘获得右轴

cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;

d.摄像机上下移动

cameraPos += cameraSpeed * cameraUp;
cameraPos -= cameraSpeed * cameraUp;

e.摄像机俯仰左右旋转  计算方向向量的俯仰pitch和偏航yaw

现设方向向量的长度为“1”;如下图:

代码如下:

glm::vec3 front;

front.x = cos(glm::radians(Pitch)) * cos(glm::radians(Yaw));
front.y = sin(glm::radians(Pitch));
front.z = cos(glm::radians(Pitch)) * sin(glm::radians(Yaw));

Front = glm::normalize(front);//方向向量
//也重新计算右和向上向量 normalize归一化
Right = glm::normalize(glm::cross(Front, WorldUp)); //相机右轴
Up    = glm::normalize(glm::cross(Right, Front));   //相机上轴

f.缩放 Zoom调整透视投影矩阵的观察角

//创建投影矩阵
glm::mat4 projection    = glm::mat4(1.0f);//单位矩阵初始化
projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
ourShader.setMat4("projection", projection);

8.矩阵方程 推导世界坐标到相机坐标的变换矩阵


  


  1 、利用逆阵求解矩阵方程
  (1) 设矩阵方程为

,是可逆方阵,即存在,在方程两边同时左乘,即得:,从而得方程组的解:,求出代入即可.
  (2) 设矩阵方程为,是可逆方阵,即存在,在方程两边同时右乘,即得:,从而得方程组的解:,求出代入即可.
  (3) 设矩阵方程为,和均为可逆方阵,即和均存在,在方程两边同时左乘,右乘,即得:,从而得方程组的解:,求出和代入即可.
 

  2 、利用逆阵求解线性方程组(当方程个数和未知量个数相等时)
  线性方程组可用矩阵方程

来表示,其中是系数矩阵,是未知量构成的列矩阵,是常数项构成的列矩阵.
  于是,当系数矩阵可逆,即存在时,在方程两边同时左乘,即得:,从而得到方程组的解:.
  注:利用逆阵求解线性方程组是有条件的,首先系数矩阵必须是方阵,即方程组所含方程的个数与未知量的个数必须相等;其次系数矩阵还必须是可逆的.这和运用克莱姆法则解线性方程组的条件是一致的.
 

  典型例题
  例6.6.6 解线性方程组   令

则方程组改写成矩阵方程.如果可逆,则方程组的解为:.
  因为  故可逆,即存在,  因此,  即  也可进一步写出:.

 
通过本节的学习,需要理解和掌握的是:
(1) 方阵可逆的定义
(2) 判断方阵可逆的两个充要条件及其在解题中的应用
(3) 利用伴随矩阵求逆矩阵的公式
(4) 可逆方阵的性质
(5) 求方阵的逆阵在解矩阵方程和线性方程组中的应用.

stanserver.cn

end

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

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

相关文章

PostgreSQL数据库TableAM——Table scan callbacks

TableAM Table scan TableAM提供了如下4个接口用于实现表数据的扫描功能。scan_begin函数的形参nkeys不为零,则扫描结果需要根据scan keys先进行过滤;pscan如果不为null,说明该结构体已经由parallelscan_initialize初始化过了(仅仅在table_b…

初识Docker:(5)Docker自定义镜像

初识Docker:(5)Docker自定义镜像镜像结构Dockerfile语法什么是Dockerfile构建Java项目案例1:基于ubuntu镜像构建一个新镜像,运行一个java项目案例2:基于java:8-alpine镜像,将一个java项目构建为…

Java+JSP机房课表管理系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用技术CSSJavaScriptMySQLServlet、MySQL数据库、项目含有源码、配套开发软件、软件安装教程、项目发布教程等 项目功能介绍: 系统管理:包含用户的注册,管理,信息修改 课程管理:包含课程录入、维…

IT大侦“碳”:VxRail的可持续法宝

环境Environmental      社会责任Social Responsibility      企业治理Corporate Governance      随着碳达峰、碳中和的逐步推进,越来越多的“大厂”或各行业的明星企业都开始重视自己的ESG报告,已然成为了商界新风尚。      可持续发展战略也与前沿技术密切相…

matlab神经网络求解最优化,matlab神经网络训练数据

1、神经网络的准确率是怎么计算的? 其实神经网络的准确率的标准是自己定义的。 我把你的例子赋予某种意义讲解: 1,期望输出[1 0 0 1],每个元素代表一个属性是否存在。像着4个元素分别表示:是否肺炎,是否肝…

哈希知识点

目录对比map/set1. unordered系列关联式容器1.1 unordered_map2. 底层结构2.1 哈希概念2.2 哈希冲突2.3 哈希函数2.4 哈希冲突解决2.4.1 闭散列线性探测和二次探测扩容(负载因子)闭散列实现的hash2.4.2 开散列概念开散列思考实现模拟实现模板参数列表的改…

Java项目:springboot农业物资管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 农业物资管理系统,管理员可以对角色进行配置,分配用户角色; 主要功能包含:登录、注册、修改密码…

并查集解决重复员工问题

简介 工作一年多了,天天CRUD,终于以前学习的算法排上用场了。 背景 我们的系统在用户注册时没有校验身份id(身份证)和电话号码的唯一,可能使用相同的身份id或者电话号码创建多个账号,导致有些人开多个账…

面试者推荐 |【Redis面试专题】「常见问答系列」透析Redis常见技术相关的问题1~10题(进阶)

📚 前提回顾 首先如果没有阅读【面试者推荐 |【Redis面试专题】「常见问答系列」透析Redis常见技术相关的问题1~10题(基础) 】,简易先去看看基础10题,因为循序渐进才是正道,哈哈。 📚 1. Redis…

WebRTC源码之RTCPReceiver源码分析

WebRTC源码之RTCPReceiver源码分析 WebRTC源码之RTCPReceiver源码分析WebRTC源码之RTCPReceiver源码分析前言一、 RTCP接受数据的流程的堆栈信息的1、网络io 线程读取数据2、 线程切换的代码3、 线程切换 gcc二、 RTCPReceiver::IncomingPacket方法读取RTCP数据的格式1、 Parse…

【PyTorch深度学习项目实战100例】—— 基于DPCNN实现电商情感分析任务 | 第79例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

随机种子 3407 is all you need

文 | 天于刀刀你最常用的随机种子是哪个?在刀刀的团队里,关于随机种子的设置主要分化为两派~玄学派,可能设置为自己的纪念日,又或者是星座预测中的本月幸运数字;以及,自然派,随机种子是啥其实无…

Java项目:springboot健身房管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为后台管理系统; 主要功能如下: 管理员登录模块 会员管理模块 教练管理模块 课程管理模块 器材管理模块 物品遗失…

一些常见的移动端适配方案,你了解吗?

前言 移动端设备的尺寸很多,而 UI 设计稿一般只会基于一个尺寸(一般是 375px 或 750px )进行设计。 目前移动端适配方案有多种,本文将介绍一些具有代表性的适配方案。 媒体查询 media CSS3 中的媒体查询属性 media 分别为不同…

量子计算(十七):量子计算机硬件

文章目录 量子计算机硬件 一、量子芯片支持系统 二、量子计算机控制系统 量子计算机硬件 量子计算机的核心——量子芯片,具有多种不同的呈现形式。绝大多数量子芯片,名副其实地,是一块芯片,由集成在基片表面的电路结构构建出包…

关于 Camera 开始 Tuning 时的一些注意事项

1、问题背景: 最近有调试一个体感游戏机上带 Camera 的项目,原定搭配 ov13855 这颗 sensor, 但由于各种各样的问题,导致做了很多无用功,且各种延期。 本文主要总结下此次项目遇到的问题,及产品开始 tuning 时的一些注意…

【折腾服务器 4】ESXi 中 Ubuntu 安装 NPS 客户端 ( NPC )

Catch Up 书接上回,上一章中,群晖已经能定期给 Windows 物理机服务器做备份了,但是依然无法从外网访问服务器上的内容,本篇讲述如何在 Ubuntu 中安装 NPS 客户端,也就是所谓的 NPC ( Client )。 Chapter 1 准备一个 …

C#语言实例源码系列-实现FTP下载文件

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

SpringSecurity(十)【CSRF 漏洞保护】

十、CSRF 漏洞保护 简介 CSRF(Cross-Site Request Forgery 跨站请求伪造),也可称为一键式攻击(one-click-attack)通常缩写为 CSRF 或者 XSRF。CSRF 攻击是一种挟持用户在当前已登录的浏览器上,发送恶意请求…

Python绘制地磁场

文章目录简介磁场绘制简介 为国际参考磁场对Python的封装,可通过经纬高度以及时间来计算地磁场强度,使用方法简单粗暴,如下 import pyIGRF pyIGRF.igrf_value(lat, lon, alt, date)参数含义为 lat 纬度lon 经度alt 海拔date 日期&#xff…