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

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

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

相关文章

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…

Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)

1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果,但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下,深度学习模型的适应程度变低,检测结果也随之下降,因此研究在复杂气象条件下的目标检测方法…

警务数据仓库的实现

目录 一、SQL Server 2008 R2(一)SQL Server 的服务功能(二)SQL Server Management Studio(三)Microsoft Visual Studio 二、创建集成服务项目三、配置“旅馆_ETL”数据流任务四、配置“人员_ETL”数据流任…

C++原创2D我的世界1.00.3 QPBSv01优化版

上次更新遗漏了一些细节,这会我加上了 #include"bits/stdc.h" #include"Windows.h" #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) using namespace std; int a49,d49,w1,n0,m[100]{0},u[100]{0},t[100]{…

Vue 3中的`createApp`

Vue 3中的createApp 在Vue 3中,createApp被用来创建一个新的应用实例。它是Vue 3的入口点,用于启动应用。createApp函数接受一个对象参数,该对象包含多个属性,这些属性用于配置和扩展Vue应用。 基本用法 import {createApp } from vue; import App from ./App.vue;const…

k8s安装traefik作为ingress

一、先来介绍下Ingress Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务,以下详细说一下 Ingress,毕竟 traefik 用的就是 Ingress 使用 Ingress 时一般会有三个组件: …

【零基础C语言】预处理解析

预定义符号 c语言中设置一些预定的符号,我们可以直接使用 //列: __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否…

基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

inkscape中文版本 G代码生成器(支持中英文及数字)使用

inkscape G代码生成器(支持中英文及数字)使用 1 inkscape安装1. 界面介绍2. 基本操作3. 图形编辑4. 图层管理5. 文件操作6. 高级功能7. 学习资源 2 laserengraver插件安装3 inkscape 使用candle 验证G代码效果 1 inkscape安装 跟着提示默认按键即可。 软…

HTML网站的概念

目录 前言: 1.什么是网页: 2.什么是网站: 示例: 3.服务器: 总结: 前言: HTML也称Hyper Text Markup Language,意思是超文本标记语言,同时HTML也是前端的基础&…

Git版本管理使用手册 - 5 - Git的.ignore文件语法

Git的.ignore文件 1.使用 .ignore文件可以忽略指定文件的版本控制。 2.语法: (1)#开头表示注释 (2)!开头表示不忽略匹配文件 (3)* 表示除/外,任何字符串 (4)?表示除/外,任何一个字符 (5)/ 如果模式的结尾有分割符/&am…

Linux 环境安装Nginx—源码和Dokcer两种安装方式

一、源代码编译安装Nginx 1.下载最新nginx源码 以nginx-1.25.3.tar.gz为例: 可以使用命令(联网):curl -O http://nginx.org/download/nginx-1.25.3.tar.gz或在官网下载.tar.gz 2.解压缩 tar -zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3/ 3.安装依赖…

HarmonyOS实战开发-实现自定义弹窗

介绍 本篇Codelab基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗,效果如图所示 相关概念 AlertDialog:警告弹窗,可设置文本内容和响应回调…

【javaWeb 第八篇】后端-Mybatis(万字详细学习)

Mybatis框架 前言MybatisMybatis入门配置SQL提示JDBC数据库连接池lombok Mybatis基础操作日志输出Mybatis的动态SQL 前言 这篇是作者学习数据持久层框架Mybatis的学习笔记,希望对大家有所帮助,希望大家能够与作者交流讨论 Mybatis Mybatis是一款优秀的…

Android 开发 Spinner setSelection 不起作用

问题 Android 开发 Spinner setSelection 不起作用 详细问题 笔者进行Android项目开发,根据上一个页面用户选择数据,显示当前页面Spinner选项,调用 Spinner setSelection 不起作用。 相关java代码 spinner.setAdapter(adapter); …

uniapp对接萤石云 实现监控播放、云台控制、截图、录像、历史映像等功能

萤石云开发平台地址:文档概述 萤石开放平台API文档 (ys7.com) 萤石云监控播放 首先引入萤石云js js地址:GitHub - Ezviz-OpenBiz/EZUIKit-JavaScript-npm: 轻应用npm版本,降低接入难度,适配自定义UI,适配主流框架 vi…

C语言例4-35:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何?

方法一&#xff1a; 代码如下&#xff1a; //鸡翁一&#xff0c;值钱五&#xff1b;鸡母一&#xff0c;值钱三&#xff1b;鸡雏三&#xff0c;值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何&#xff1f; //方法一&#xff1a; #include<stdio.h> int main(void) {int x…

简易挛生分拣系统设计

1 工效组合展示 2 方案规划设计 3 数字挛生建模 基础建模、动画设计、模型导出 4 软件体系架构 5 Web交互设计 5.1 页面架构 5.2 初始构造 5.3 模型运用 5.4 WS通信 5.5 运行展现 6 服务支撑编码 6.1 整体调度 6.2 WS服务 6.3 C/S通信 7 系统级调试完善

李雅普诺夫函数

李雅普诺夫函数是一种用于描述动力系统稳定性的数学工具。它在动力系统和控制理论中具有广泛的应用&#xff0c;尤其是在研究非线性系统的稳定性方面。 李雅普诺夫函数通常用于证明动力系统在一些条件下是稳定的。一个李雅普诺夫函数是一个实数值函数&#xff0c;通常表示为 V…

外文文献翻译以及阅读方法

翻译外文文献可以采取以下步骤&#xff1a; 阅读整篇文章&#xff0c;了解全文内容的大意和结构。 对文章进行逐段翻译&#xff0c;可以先用大意翻译整段&#xff0c;再细化到每个句子和词语。 在翻译过程中&#xff0c;要注意保持原文的逻辑结构和表达方式&#xff0c;尽量…