gl-Camera

Camera Api 2 和 OPEN GL ES 使用(显示滤镜效果) 相机预览滤镜功能实现,通过cameraAPI2 配合 OpenGL ES简单实现效果。 主要在于继承GLSurfaceView 和实现 GLSurfaceView.Renderer,同时将创建的surface 传递到相机中。后续相机图像传入onDrawFrame中,并在通过Opengl 提供的方法,在gl线程中渲染预览图像,达到显示效果。 阅读详情

我的服务原文访问: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

OpenGL 入门 8:摄像机 OpenGL 摄像机 阅读详情

相关推荐

【OpenGL】摄像机实现理解每个公式

OpenGL学习摄像机有关的知识。

qq_18718337的博客 1485

OpenGL 学习笔记(十六)

结果就是,如果我们的deltaTime很大,就意味着上一帧的渲染花费了更多时间,所以这一帧的速度需要变得更高来平衡渲染所花去的时间。使用这种方法时,无论你的电脑快还是慢,摄像机的速度都会相应平衡,这样每个用户的体验就都一样了。如果设置成常量的话,会因为使用者配置的不同,有些人可能移动很快,而有些人会移动很慢,很影响使用;通过摄像机的俯仰角与偏航角来最后确定生相机的朝向,最后与摄像机移动一起构建改变之后的观察矩阵;通过鼠标(或手柄)水平的移动影响摄像机的偏航角,竖直的移动影响摄像机的俯仰角;

程序猿老樊的博客 592

Android Camera开发实践(4) SurfaceTexture与特效

外链图片转存中…(img-4h9FDGfL-1734616945519)]一个window中所有的view最后会合成一个图像绘制到屏幕上,但SurfaceView除外,SurfaceView有自己的独立窗口,所以SurfaceView性能较好,但是功能上不如TextureView操作方便,不支持旋转,平移等操作。参考[外链图片转存中…

2401_89740586的博客 893

GLM(openGL mathematic)库使用记录

1. GLM数学库常用函数 1.1 关于向量 (1)glm库中向量的定义都是使用一维数组 (2)glm::normalize(vector)-----标准化向量 (3)glm::cross(vector1,vector2)-----向量的×乘 (4)glm::dot(vector1,vector2)-----向量的点乘 Waiting for adding… 1.2 关于矩阵 (1)glm库中矩阵的定义都是使用二维数组 (2)glm库中矩阵的乘法都是相反的。例如AB,在glm中计算的结果与大学所学线代中矩阵

JuniorChestnut的博客 6196

利用Mapbox Gl Free Camera API打造地图动画效果

Mapbox Gl JS 是一个功能强大的库,它为开发者提供了一种便捷的方法来创建和定制交互式地图,使得在网页上展示空间数据成为可能。它的出现极大地丰富了Web地理信息系统(Web GIS)的应用场景,无论是简单的地理信息标记,还是复杂的地图分析功能,Mapbox Gl JS 都提供了一套完善的解决方案。Free Camera API的主要功能是允许开发者不受限制地控制地图摄像机,包括摄像机的方向、位置、缩放级别等。这样的功能尤其适用于需要高度自定义视图的应用,例如房产展示、虚拟旅游、游戏地图等。

weixin_36012152的博客 913

基于GPUImage与Camera2的Android实时美颜相机技术实现

图像处理是移动应用开发中的高级领域,涉及GPU渲染、纹理映射等基础概念。在Android平台上,实时美颜相机的实现依赖Camera2 API与OpenGL ES的紧密配合,通过SurfaceTexture将相机帧送入GPU进行片元着色器处理,形成可复用的滤镜链。这一技术避免了CPU与GPU间的数据拷贝,显著提升处理效率,其价值在直播、短视频、自拍App等场景中尤为突出。以一个毕业设计源码为例,重点分析GPUImage引擎、yuv-decoder.c的作用以及滤镜参数的调优策略,展示如何构建从相机采集、实时美

weixin_28693683的博客 247

Unity中使用GL在Camera上绘制文字

Unity中使用GL在Camera上绘制文字 我在项目中遇到一个需求,需要在Camera上使用GL绘制文字。最好的办法是使用BMFont文字,将文字以纹理的形式绘制在Camera上。 会用到的工具:NGUI,BMFont。这两个工具在网上很容易找到。 使用BMFont导出字体 1.首先使用BMFont导出文字图集,我这里只需要导出数字,所以我只选中了数字,如下图 2.打开Option

kevinXie的博客 3724

GLCamera:基于 OpenGL ES 开发,支持实时滤镜、相机录制、视频播放功能

GLCamera 多种滤镜 后期仍会扩展 支持相机录制

Unity中使用GL在Camera上画线

Unity中使用GL在Camera上画线using System.Collections; using System.Collections.Generic; using UnityEngine;public class joint { public Vector3 org; public Vector3 end; } public class GLTest : MonoBehavi

kevinXie的博客 2975

遥感图像处理实战:DOTA数据集旋转框转YOLO格式全流程解析(附代码)

本文详细解析了将DOTA遥感数据集的旋转框标注转换为YOLO格式的全流程。针对遥感图像中物体朝向任意性的特点,文章重点阐述了将旋转框转换为外接水平框的数学原理与代码实现,并提供了批量转换脚本和可视化验证方法,帮助开发者高效处理数据,为基于YOLO的遥感目标检测项目奠定基础。

weixin_29082143的博客 397

人工智能-CS188 Project 2: Multi-agents

一、项目介绍 项目介绍网页 项目代码下载 本项目是采用Berkeley的CS188课程内容实习二的内容,在这个项目中,我们将为经典版本的Pacman 设计自动算法,包括幽灵。在此过程中,我们将实现 minimax 和 expectimax 搜索并尝试评估函数设计 完成作业只需要完成5个题目,按照项目介绍的步骤进行完成,主要是在multiAgents.py文件中进行补充代码 二、代码详情 1、Question1:Reflex Agent 略 2、Question2:Minimax 套用ppt上的minm

xiten的博客 8282

memory leak : Camera 滤镜用例,GL环境内存泄漏

11111111111

434

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

Unity之GL画线

一、GL画牵引线 注意:若想GL画出来的线显示在UI(UGUI)上面,将UI的画布Canvas的Render Mode设置为为Screen Space - Camera,下面的Render Camera使用主相机,并且保证Sorting Layer 为 Default、 Order in Sorting 值为 0 二、效果图如下: 注意:图中绿色牵引线为GL画线,两头圆圈为UI 三、代码如下 注...

wangjingxhz的博客 2257

Flutter for web 首次加载过慢问题优化

Flutter web 加载慢优化

Bright_TY的专栏 7834

Vue3 + OpenLayers 开发指南(一) - 环境搭建与基础配置

本文详细介绍了如何从零开始搭建Vue3与OpenLayers的集成开发环境。通过项目初始化、核心依赖安装、目录结构规划及基础配置,手把手引导开发者创建一个结构清晰、可维护的现代化WebGIS应用骨架,为后续添加地图图层和交互功能奠定坚实基础。

weixin_28049429的博客 339

Android OpenGLES2.0开发(八):Camera预览

该篇章主要讲解了OpenGL ES对外部纹理Camera预览数据的渲染

xiaozhiwz的专栏 1678

YOLOv13改进:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

BiLevelRoutingAttention方法对小目标检测效果比较好。可能是因为BRA模块是基于稀疏采样而不是下采样,一来可以保留细粒度的细节信息,二来同样可以达到节省计算量的目的。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1432

Android Camera2 + OpenGL离屏渲染示例

本文介绍了在Android中使用EGL环境初始化GL线程并创建SurfaceTexture的方法。首先通过GLThread类初始化EGL显示、配置和上下文,创建离屏渲染的虚拟Surface。然后在GL线程中生成纹理ID并创建SurfaceTexture,设置帧可用监听器处理图像数据。最后将SurfaceTexture转换为Surface用于相机输出配置。关键注意事项包括:SurfaceTexture操作必须在同一线程完成,updateTexImage()需在创建线程调用,以及资源释放时需销毁EGL上下文。该

wolf0706的专栏 1595

OSCP-1-3-natraj(本地文件包含、日志中毒、apache2配置漏洞、nmap提权)

像往常一样,我们将使用“Netdiscover”工具识别主机的 IP。所以,让我们首先用 nmap 列出所有 TCP 端口。我们从访问web服务(80端口)开始,在那里我们找到了几张关于Natraj的图片和信息,我们将查看源代码和robots.txt,似乎没有什么有用的。(或至少,目前)。因此,让我们继续进行。在 Dirb 及其默认字典的帮助下,我们找到了一个名为“”的目录。我们进入并列出一个名为“”的文件:如果我们执行它,我们会看到它什么也不做。我们可能需要添加其他内容。

墨痕诉清风的博客 528

【GlobalMapper精品教程】072:GlobalmapperV25中文版下载地址及安装教程

GlobalmapperV25中文版下载地址及安装教程安装包位于专栏完整数据包中,请订阅后从优快云私信查收!最新GlobalMapper中文版入门实战实验教程,图文并茂,实用性强,内容包括:GM基础操作、数据处理及地形图制作、航测内业数据处理、点云处理、地形分析、空间分析、数据库建库入库等。配套完整案例数据,持续同步更新!订阅专栏后,从私信查收中文安装包永久版(中文23.0+24.0)及配套实验数据包。

智慧空间实验室 4728

Unity3D笔记十八 GL图像库

  1、绘制2D图像的时需要使用GL.LoadOrtho()方法来将图形映射到平面中。   2、所有绘制相关的内容都要写在OnPostRender()方法中。   3、有关GL图像库的脚本需要绑定到Hierarchy视图中Camera上,否则无法显示绘制的图像。   4、在GL图像库的平面坐标系中,每个点的横坐标和纵坐标都应当是0与1之间的浮点数,而真实的像素坐标需要根据这个浮点数来计算 ...

weixin_30344995的博客 155

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OPEN GL学习笔记 (二)camera、坐标系统、图像变换

文章目录Transformationmathmatic basicsvector- vector multipilcationMatrix-vector multiplication (scaling, Translatioin, Rotation)combine matrixGLM 此博客为学习笔记,参考:https://learnopengl-cn.github.io Transformati...

qq_41956860的博客 1065

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Projective Texture的原理与实现

    Projective Texture是比较常见的一种技术,实现起来代码也就区区的不过百行,了解其原理及技术细节是我们的重点,知其然,知其所以然。       粗略的说就是想象场景中有台投影仪(Projector),texture就是我们投影的内容,把纹理放在近裁剪面(near clip plane)上,沿着投影仪的方向把纹理投影到场景中。Xheartblue兄翻译了一篇文章,很好的

7547

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MTK camera 4.2 UI layout 结构(2013/4)

前言 该结构图为MTK原生4.2 Camera界面的UI layout.  该图利用UML工具完成。  类名如果是.xml结尾表示该类是一个xml layout文件。会在属性中指出其具体的ViewGroup类名。 UI layout结构图 UI layout结构分析 直观感受 4.2 UI Layout相比于4.0 camera 的UI l

wlia的专栏 408

Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理

http://www.mamicode.com/info-detail-1723122.html Android Lollipop 增加了Camera2 API,并将原来的Camera API标记为废弃了。相对原来的Camera API来说,Camera2是重新定义的相机 API,也重构了相机 API 的架构。初看之下,可能会感觉Camera2使用起来比Camera要复杂,然而使用过后,你也许就会...

weixin_34055910的博客 276
上一篇: 苹果多线程GCD
下一篇: ​autoReconnect = ture​ 链接池包错
Stan_Shi
博客等级 码龄9年 4粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值