OpenGL-坐标系概念

2023-05-16

笛卡尔坐标系

  • 二维绘图:笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向Y轴为垂直方向,X和Y相互垂直

 

二维笛卡尔坐标系

  • 三维绘图:笛卡尔坐标多了一个Z轴Z轴同时垂直于X和Y轴Z轴的实际意义代表着三维物体的深度

 

三维笛卡尔坐标系

  • 坐标裁剪:窗口是以像素为单位进行度量的。开始在窗口中绘制点、线和形状之前,要把指定的笛卡尔坐标对翻译成屏幕坐标,我们可以通过指定占据窗口的笛卡尔区域来转换,这个区域叫做裁剪区域

PS:
x,y,z,w:指的不是四维,其中w指的是缩放因子


视口

在显示器的屏幕窗口上定义一个对齐的矩形的视口,OpenGL会自动建立世界窗口视口的变换(包括缩放和平移)。当世界窗口中所有对象都被绘制时,对象在世界窗口中的部分会被自动地映射到视口中————换句话说,被映射到屏幕坐标中,即像素在显示器上的坐标。

视口就是窗口内部用于绘制裁剪区域的客户区域

坐标系统从笛卡尔坐标到物理屏幕像素的映射是通过视口(viewport)的设置来指定

 

// 视口的设定通过glViewport()函数,它的原型是:
 void glViewport(GLint x,GLint y,GLint width,GLint ehignt);
//它设置窗口的左下角,以及宽度和高度。

视口一般和窗口是等比的


投影方式

正投影(Orthographics Projection)或平行投影

  • 视景体:正方形/长方形
  • 不存在近大远小
  • 适合平面图形/2D图形渲染

透视投影

  • 视景体:平截体
  • 近大远小
  • 适合使3D图像渲染

 

左侧-透视投影,右侧-正投影


左右手坐标系

 

左/右手坐标系

  • OpenGL坐标系(物体、世界、照相机坐标系)属于右手坐标系
  • 设备坐标系使用的是左手坐标系

坐标系

OpenGL里每个顶点的z,y,z都应该在−1到1之间,超出这个范围的顶点将是不可见

顶点坐标->着色器处理->设备坐标->光栅器->变换为屏幕二维坐标和像素

顶点坐标在转换为屏幕坐标之前会变换多个坐标系统(Coordinate System),之所以引入过渡坐标系是为了更加方便操作和运算

共有5中比较重要的坐标系系统

  • 局部空间(Local Space,或者称为物体空间(Object Space))
  • 世界空间(World Space)
  • 观察空间(View Space,或者称为视觉空间(Eye Space))
  • 裁剪空间(Clip Space)
  • 屏幕空间(Screen Space)

将顶点从一个坐标系转换到另一个坐标系需要用到几个变换矩阵,其中几个比较重要的是模型(Model)、观察(View)、投影(Projection)三个矩阵

物体顶点的起始坐标按序经过上述5个坐标系系统最终转换为屏幕坐标

图形学中的几个比较重要的坐标系:

1.世界坐标系
它是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考系。也就是说,可以用世界坐标系去描述其他所有坐标系或者物体的位置。所以有很多人定义世界坐标系是“我们所关心的最大坐标系”,通过这个坐标系可以去描述和刻画所有想刻画的实体。

世界坐标系又称全局坐标系或者宇宙坐标系

2.物体坐标系
物体坐标系与特定的物体关联,每个物体都有自己特定的坐标系。不同物体之间的坐标系相互独立,可以相同,可以不同,没有任何联系。同时,物体坐标系与物体绑定,绑定的意思就是物体发生移动或者旋转,物体坐标系发生相同的平移或者旋转,物体坐标系和物体之间运动同步,相互绑定。

举例说明一下物体坐标系:我们每个人都有自己的物体坐标系,当我们决定要往前走的时候,每个人实际前行的绝对方向都不一样,可能是向北,也可能向南,或者其他方向。这里前后左右是物体坐标系中的概念。当告诉张三往前走,就是张三同学沿着自己物体坐标系的前方运动。至于张三往前走是往东还是向北,这是张三的运动在世界坐标系下的描述。

 

坐标系

这个立方体的物体坐标系如图所示,不论该立方体位于世界坐标系的任何位置,处于什么角度,物体坐标系与物体都是绑定在一起。
物体坐标系又称模型坐标系

3.摄像机坐标系

  • 在坐标系的范畴里,摄像机坐标系等同于照相机坐标系
  • 照相机坐标系是和观察者密切相关的坐标系
  • 照相机坐标系和屏幕坐标系相似,差别在于照相机坐标系处于3D空间中,而屏幕坐标系在2D平面里。

4.惯性坐标系
惯性坐标系是为了简化世界坐标系到惯性坐标系的转化而产生的。惯性坐标系的原点与物体坐标系的原点重合,惯性坐标系的轴平行于世界坐标系的轴。引入了惯性坐标系之后,物体坐标系转换到惯性坐标系只需旋转,从惯性坐标系转换到世界坐标系只需平移
从惯性坐标系转换到世界坐标系只需要平移


坐标转换

物体坐标/对象坐标(Object Space)
|
模型变换(transformation)
|
世界坐标(World Space)
|
视变换(Viewing)
|
观察者坐标/摄像机坐标(Eye Space)
|
投影变换(Projection transformation)
|
裁剪坐标(Clip Space)
|
透视除法(Perspective divide)
|
规范化设备坐标(NDC Space)
|
视口变换(ViewPort mapping)
|
屏幕坐标(Screen space)

  • OpenGL只定义了裁剪坐标系、规范化设备坐标系和屏幕坐标系

  • 局部坐标系(模型坐标系)、世界坐标系和照相机坐标系都是为了方便用户设计而自定义的坐标系

用户自定义变换(在顶点着色器中完成)
Attribute->Vertex->模型变换(Model Space) ->World Space>Camera Space->Clip Space
|
OpenGL变换(顶点着色器处理后的阶段完成)
透视除法(Clipping)->NDC Space->Window Space->Render

视口变换:
使用 glViewPort 内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标关联一个屏幕上的点的过程

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL-坐标系概念 的相关文章

  • C#中使用SendMessage进行进程通信,可发送字符串,结构体(不能发送类类型)。

    发送时只能以结构体形式发送 xff0c 类的话会提示 指定结构必须能直接复制到本机结构中 xff0c 或是具有布局信息 的错误提示 以下两种结构体示例都可以被发送 public struct A public A int a name 61
  • c#windows消息循环sendmessage实例

    DllImport 34 User32 dll 34 EntryPoint 61 34 SendMessage 34 private static extern int SendMessage IntPtr hWnd 信息发往的窗口的句柄
  • mysql 8.0.19 winx64安装及修改初始密码

    本文为大家分享了mysql 8 0 19 winx64安装教程 xff0c 供大家参考 xff0c 具体内容如下 1 下载mysql 8 0 19 winx64 1 1 进入地址 xff1a https dev mysql com down
  • ARM映像文件

    ARM映像文件 ARM中的各种源文件 xff08 包括汇编文件 xff0c C语言程序及C 43 43 程序等 xff09 经过ARM编译器编译后生成ELF xff08 Executable and linking format xff09
  • mysql安装问题汇总

    注意 xff0c xff08 1 xff09 首次安装mysql时自动生成密码后必须再手动改密码 xff0c 否则会提示修改密码 xff08 2 xff09 注意cmd命令里的字符格式 xff08 3 xff09 修改密码有些情况下不能设置
  • mysql数据库迁移到另一台电脑上

    解决办法 mysql要转换到另一台机器上面 xff0c 最重要的要考虑以下几个问题 1 数据库使用什么存储引擎 xff0c 如果是myisam的话 xff0c 可以把data目录复制移走 但如果是innodb的话 xff0c 千万不要用这种
  • winform的UI设计关键属性汇总

    1 将控件的坐标转换成屏幕的坐标 br KeyBoard StartPosition 61 FormStartPosition Manual br Point showPoint 61 ActiveTBox PointToScreen ne
  • winform中UI设计分辨率问题

    1 UI设计可以自适应或固定分辨率 xff0c 自适应需要手动写调整控件尺寸位置代码 xff1b 固定分辨率需要固定尺寸的UI资源图片 xff08 如背景图片 xff09 和固定的终端分辨率 xff08 如pc端不一致需调整分辨率为初始设计
  • C#中改变进度条(progressbar)的颜色

    改变系统自带进度条的方法就是重绘了 具体方法如下 xff1a 1 自定义控件继承自ProgressBar xff0c 如下 xff1a public class CustomProgressBar ProgressBar public Cu
  • c#中设计器中窗体释放  protected override void Dispose(bool disposing)改写解决部分窗体线程释放不彻底问题

    c 中设计器中窗体释放 protected override void Dispose bool disposing 改写解决部分窗体线程释放不彻底问题 lt summary gt 清理所有正在使用的资源 lt summary gt lt
  • 每个Form类都实现了IWin32Window接口!

    每个Form类都实现了IWin32Window接口 xff01 Form Show IWin32Window 在From1的cs文件中实例化Form2 myForm2 Show this 就可以弹出非模态的窗体 而且form2是Form1的
  • c#winform控件过多卡顿问题解决方案

    近期在项目中遇到了登录以及切换界面时 xff0c 界面不停闪烁的问题 xff0c 经过查阅发现以下方法可以成功解决该问题 将下面代码添加到窗体代码中即可 xff1a protected override CreateParams Creat
  • 子类继承父类后调用virtual函数问题(base.函数名)

    void Main SonB s 61 new SonB s Show 先调用子类的函数 xff0c 再调用基类的函数 xff08 在子类方法中base Show xff09 xff0c 一共messageBox show 了两次 publ
  • MVVM简介与运用

    前言 在介绍MVVM框架之前 xff0c 先给大家简单介绍一下MVC MVP框架 xff08 由于本博文主要讲解MVVM xff0c 所以MVC和MVP将简化介绍 xff0c 如果需要我将在以后的博文中补充进来 xff09 MVC框架 xf
  • 基于Tensorflow 三层神经网络拟合二次函数(附代码与解析)

    文章目录 前言一 隐藏层函数二 生成二次函数与损失函数 1 二次函数与画图2 损失函数三 训练数据总结 前言 刚入手深度学习 xff0c 结合这几天看的视频与内容 xff0c 将其整合成文章 提示 xff1a 以下是本篇文章正文内容 xff
  • C#中如何获取鼠标及控件的位置坐标(相对于屏幕)

    0 xff1a Control PointToScreen xff1a 将指定工作区点的位置计算成屏幕坐标 1 xff1a Control MousePosition 鼠标相对于屏左上角的坐标 xff1b 2 xff1a this Poin
  • windows系统-汇编语言的语法是“操作码+操作数”

    在汇编语言中 xff0c 1行表示对CPU的一个指令 汇编语言指令的语法结构是操作码 43 操作数 xfffc xff08 也存在只有操作码没有操作数的指令 xff09 操作码表示的是指令动作 xff0c 操作数表示的是指令对象 操作码和操
  • windows系统-程序编译过程

    系统调用和高级编程语言的移植性 操作系统的硬件控制功能 xff0c 通常是通过一些小的函数集合体的形式来提供的 这些函数及调用函数的行为统称为系统调用 xff08 system call xff09 xff0c 也就是应用对操作系统 xff
  • windows系统-汇编语言与机器码的关系

    接下来就让我们进入到本章的前半部分 在前面章节中已经多次提到 xff0c 计算机CPU能直接解释运行的只有本地代码 xff08 机器语言 xff09 程序 用C语言等编写的源代码 xff0c 需要通过各自的编译器编译后 xff0c 转换成本
  • windows系统-函数的条件分支实现用汇编语言解释

    下面让我们来看一下条件分支的实现方法 条件分支的实现方法同循环处理的实现方法类似 xff0c 使用的也是cmp指令和跳转指令 xff0c 这一点估计大家也预料到了 没错 xff0c 条件分支就是利用这些指令来实现的 不过 xff0c 为了以

随机推荐

  • windows系统-程序加载时生成栈和堆的过程

    EXE文件的内容分为再配置信息 变量组和函数组 xff0c 这一点想必大家都清楚了吧 不过 xff0c 当程序加载到内存后 xff0c 除此之外还会额外生成两个组 xff0c 那就是栈和堆 栈是用来存储函数内部临时使用的变量 xff08 局
  • winform-日记

    1 Form的属性TopLevel设置为false xff0c 就相当于usercontrol的功能了 xff0c 可以被包含在容器中 xff0c 只不过需要动态在代码中加载 xff0c usercontrol则可拖拽
  • C# DataTable用法详解

    添加引用 using System Data 创建表 创建一个空表 DataTable dt 61 new DataTable 创建一个名为 34 Table New 34 的空表 DataTable dt 61 new DataTable
  • C#操作SQLite数据库增、删、改、查 实例

    最近项目上要使用SQLite数据库 xff0c 不怕大伙笑话毕业四年多了 xff0c 一直使用Oracle或者MySQL或者SQLServer xff0c 但是真的是没有用过SQLite数据库 xff0c 据说非常轻量级 xff0c 但是真
  • halcon相机标定及畸变矫正

    1 halcon相机标定和图像矫正 对于相机采集的图片 xff0c 会由于相机本身和透镜的影响产生形变 xff0c 通常需要对相机进行标定 xff0c 获取相机的内参或内外参 xff0c 然后矫正其畸变 相机畸变主要分为径向畸变和切向畸变
  • C# SQLite 数据库操作实例2

    运行环境 xff1a Window7 64bit xff0c NetFramework4 61 xff0c C 7 0 参考 xff1a SQLite 官网SQL As Understood By SQLiteSystem Data SQL
  • 计算机代码内大数据内存堆栈溢出问题

    1 因为不管是c 43 43 还是c xff0c 他们的对象内存都是在堆栈中分配的 xff0c 加入堆栈中有2G空闲空间 xff0c 但是这2G的空间不是连续的 xff0c 也就是说 最大的一块可供缓存数据的内存空间是这2G空间里最大的一片
  • 提高SQLITE 大数据量操作效率的方法

    SQLite 作为一个轻量级嵌入式数据库 xff0c 还是非常好用的 批量插入1000条记录 xff0c 居然耗时 2 分钟 xff01 以下是测试代码 using System Data using System Data Common
  • 在C#项目中使用SQLite(环境安装问题)

    下面这两个是不同的 xff1a 1 System Data SQLite xff08 http system data sqlite org index html doc trunk www index wiki xff09 2 SQLit
  • sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样?详述

    sqlite是款不错的数据库 xff0c 使用方便 xff0c 不需要事先安装软件 xff0c 事先建表 很多人担心它的性能和数据存储量问题 比如有的网友问 xff1a Sqlite数据库最大可以多大呀 xff1f 会不会像acc数据库那样
  • c#子线程中打开系统文件操作对话框

    出错环境 多线程接收文件的时候 需要打开一个SaveFileDialog对象 并调用ShowDialog 方法 出错代码 nbsp html nbsp nbsp nbsp view plain nbsp copy void nbsp thr
  • winform程序最大化时,页面显示不全的问题

    最后贴上引起这个原因的代码 xff0c 但是这段代码不能去掉 xff0c 我要用 xff0c 这段代码可以解决页面切换时的闪烁问题 如果去掉这段代码 xff0c 确实可以完整显示窗口 xff0c 但是闪烁太严重了 最大化后 xff0c 试试
  • C# 捕获系统闪退BUG

    在程序入口添加代码 namespace MainForm static class Program lt summary gt 应用程序的主入口点 lt summary gt STAThread static void CurrentDom
  • Qt中使用OpenGL进行绘图

    Qt Creator中的3D绘图及动画教程 参照NeHe 刚刚学习了Qt Creator xff0c 发现Qt提供了QtOpenGL模块 xff0c 对OpenGL做了不错的封装 xff0c 这使得我们可以很轻松地在Qt程序中使用OpenG
  • 优化Hbase查询速度

    环境 xff1a suse 8G内存 xff0c 8核 xff0c 12T磁盘 hbase master 占一台 xff0c 其他7台作为hbase的region server 注意 xff1a 此处不讨论hadoop 情景 xff1a 我
  • QT中使用OpenGL绘制图形

    Qt Creator中的3D绘图及动画教程 参照NeHe 刚刚学习了Qt Creator xff0c 发现Qt提供了QtOpenGL模块 xff0c 对OpenGL做了不错的封装 xff0c 这使得我们可以很轻松地在Qt程序中使用OpenG
  • C#中使用OpenGL(API)创建OpenGL渲染环境

    在C 中调用1 1版本的OpenGL函数 xff0c 但是光有OpenGL函数还不能绘制图形 xff0c 就像一个画家 xff0c 他即使拥有绘画的技巧 xff0c 还有画笔和颜料 xff0c 如果没有画布 xff0c 他也没有地方画画 有
  • GPU、GPU驱动、OpenGL、游戏引擎之间的关系

    游戏引擎使用OpenGL渲染 xff0c OpenGL调用显卡驱动告诉GPU干活 xff0c GPU经过各种计算把最终的图像渲染出来 游戏引擎 xff1a 用于制作游戏或其它实时交互交互图形程序的软件 xff0c 大多数游戏引擎都包含了渲染
  • C#中使用tao.opengl绘制三维模型

    一 tao Opengl技术简介 Opengl是一种C风格的图形库 xff0c 即opengl中没有类和对象 xff0c 只有大量的函数 Opengl在内部就是一个状态机 xff0c 利用不同的函数来修改opengl状态机的状态 xff0c
  • OpenGL-坐标系概念

    笛卡尔坐标系 二维绘图 xff1a 笛卡尔坐标有一个X轴和一个Y轴组成 xff0c X轴为水平方向 xff0c Y轴为垂直方向 xff0c X和Y相互垂直 二维笛卡尔坐标系 三维绘图 xff1a 笛卡尔坐标多了一个Z轴 xff0c Z轴同时