当前位置: 首页 > news >正文

OpenGL的MVP矩阵理解

OpenGL的MVP矩阵理解

右手坐标系

右手坐标系与左手坐标系都是三维笛卡尔坐标系,他们唯一的不同在于z轴的方向,如下图,左边是左手坐标系,右边是右手坐标系
在这里插入图片描述
OpenGL中一般用的是右手坐标系

1.模型坐标系(Local Space)
模型坐标系(或者叫本地坐标系、局部坐标系,本文后面统一称模型坐标系)顾名思义,就是以物体的正中心为原点的坐标系,通常,我们从三维软件中导出的模型基本是局部坐标系,以模型的中心为原点,其他顶点相对于模型的原点来定义。
2. 世界坐标系 (World Space)
世界坐标系就是全局的那个坐标系,我们的物体,以及后面观察物体用到的摄像机全都在世界坐标系中,原点为(0,0,0)
3. 视图坐标系(View Space)
视图坐标系也就是在世界坐标系中通过假想一个摄像机或者观察者的存在,以摄像机的位置为中心原点,然后从摄像机这个观察者的角度去重新计算世界中的物体相对于摄像机原点的坐标

什么是MVP矩阵?

MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。

 gl_Position = projection * view * model * vec4(x,y,z, 1.0);

模型(Model)矩阵

模型矩阵主要做的旋转、缩放、平移操作
案例:
按世界坐标(0,0,0)为原点,绘制一个正方体如下图,这时候,模型坐标系和世界坐标系原点是重合的,A为正方体的左上前方位置坐标。对应坐标(-0.5,0.5,0.5)
在这里插入图片描述

如果,绘制10个,分别进行旋转、平移、缩放,对应如下图,对应的每个3维正方体,对应世界坐标的位置(0,0,0),对应的A的坐标,模型坐标系还是(-0.5,0.5,0.5),那个世界坐标呢?就是A(-0.5,0.5,0.5)进行旋转、平移、缩放的坐标
在这里插入图片描述
对应具体矩阵看该章节
第四章 OpenGL ES 基础-位移、缩放、旋转原理
[

观察(View)矩阵

OpenGL中其实不存在专门的相机,view矩阵的目的就是确定物体与相机的相对位置。注意,此处的物体指的是全部的物体形成的集合,也就是案例中的十个正方体形成的组,而不是某个单一物体
在这里插入图片描述
先简单的把相机的位置按世界坐标系相对相机cameraPos(0,0,-3)按轴进行观察,想看到物体看起来变得更远,可以此时物体位于相对相机(0,0,-5),相机位置在z轴更远,正方体更小。这里说明一下视图坐标系,如果按视图坐标系原点cameraTarget(0,0,0),世界坐标系的原点位置就是(0,0,-3)。上图相机观察方向可以自己补充,相对的移动旋转等操作

glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, -3.0f);
glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);
glm::vec3 cameraDirection = glm::normalize(cameraPos - cameraTarget);

对应的矩阵变化可以LookAt观察矩阵https://blog.csdn.net/qinze5857/article/details/130505925

投影(Projection)矩阵

投影矩阵为了把3D的渲染在2D的屏幕
第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵

上面文章有参考,该文章https://blog.csdn.net/Lindy_pass/article/details/132408991

相关文章:

  • 专业130+总分410+西南交通大学924信号与系统考研经验西南交大电子信息通信工程,真题,大纲,参考书。
  • 【概率基础】从概率角度去解释回归和分类的主要区别是什么?
  • 文本文件操作
  • 设计模式 —— 设计原则
  • 前端-包管理器
  • MR混合现实情景实训教学系统在军事演练课堂中的教学应用
  • Python+Django+Yolov5路面墙体桥梁裂缝特征检测识别html网页前后端
  • Java设计模式—备忘录模式(快照模式)
  • 【问题分析】InputDispatcher无焦点窗口ANR问题【Android 14】
  • 探索SOCKS5代理、代理IP、HTTP与网络安全
  • C++:sizeof关键字(7)
  • 【论文阅读】ELA: Efficient Local Attention for Deep Convolutional Neural Networks
  • Linux基础篇:解析Linux命令执行的基本原理
  • 淘宝商品采集API商品详情数据接口商品搜索列表API接口
  • 括号生成(回溯+剪枝)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • co.js - 让异步代码同步化
  • Cumulo 的 ClojureScript 模块已经成型
  • Redis 中的布隆过滤器
  • vue.js框架原理浅析
  • 笨办法学C 练习34:动态数组
  • 关于springcloud Gateway中的限流
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 让你的分享飞起来——极光推出社会化分享组件
  • 事件委托的小应用
  • 我的面试准备过程--容器(更新中)
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 用jquery写贪吃蛇
  • #define 用法
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2015)JS ES6 必知的十个 特性
  • (笔试题)分解质因式
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (转)Unity3DUnity3D在android下调试
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net 6.0 处理跨域的方式
  • .net 7 上传文件踩坑
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net反编译的九款神器
  • .NET企业级应用架构设计系列之开场白
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /etc/shadow字段详解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • @在php中起什么作用?
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ NOI 2001 ] 食物链
  • [ 转载 ] SharePoint 资料
  • [Android]通过PhoneLookup读取所有电话号码
  • [APUE]进程关系(下)
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)