opengl 比如 用到glm::translate(x,y,z) 表示 移动x,y,z个单位, 那么这个这个单位是指什么呢?这里的单位不是指像素,是根据投影矩阵的变化而变化的,默认情况下投影矩阵Projection是单位矩阵,那么 宽和高的屏幕范围为 (-1.0f,1.0f),0.0表示的是屏幕的中间,这就是为什么在我们看到的一些例子中,如果仅仅是为了展示绘制三角形或者四边形,没有涉及到视图矩阵和投影矩阵的时候,设置(-0.5,-0.5) (0.5,-0.5) (0.5,0.5) (-0.5,0.5)这种坐标。因为此时边框范围就是 (-1.0f,1.0f)。

但是当我们 设置了投影矩阵的时候,比如用glm库中的 glm::perspective(60.0f, width / height, 10.0f, 1000.0f); 这个函数返回一个 投影矩阵,然后 投影矩阵 * 模型视图矩阵之后所得到的坐标并投影到 屏幕中的时候,就会模拟出我们眼睛看到的物体的效果。60指的是我们眼睛看到的范围的度数, width / height 为宽高比,这个和屏幕宽高比一致,这样绘制出的图形不会拉伸变形。0.1f和1000.0f这里 是指离我们眼睛的 裁剪体距离,这里也是指Z方向的单位,不是像素,比如我们如果设置某个点为(x,y, 8.0f),在裁剪体之外,那么是不会绘制到屏幕中的。

那么x,y 的单位是怎么定义的呢,比如我们想绘制 一个小球让他的中心点位于 屏幕中1/4的位置,应该如何设置。如果我们没有设置投影矩阵,那么让坐标为(-0.25,-0.25,0)就可以。如果我们需要设置投影矩阵和视图矩阵(就是根据‘照相机’的位置返回一个矩阵,然后我们世界坐标和这个相机相乘,模拟以相机为原点进行观察物体的效果),那么在点的不同的Z坐标的情况下,他们的单位是不一样的。透视投影会通过z轴的不同,显示近大远小的效果,比如两个点(-10,0,-10)和(-10,0,-5)通过透视投影之后,前者会比后者呈现的图像大。所以如果想让2个点投射到 近裁剪面相同的位置,让他们重合,方法之一是把后者 改为(-5,0,-5),让他们比例一样,这样投射到屏幕中之后位置就相同了。从这里可以看出,2个点各自的单位不一样了,虽然呈现在屏幕的位置一样。

比如在cocos中,通过设置裁剪矩阵和视图矩阵的距离和角度,让屏幕上z坐标为0的点的‘单位’恰好为 设计分辨率的单位 ,这样我们可以忽略实际分辨率,直接以设计分辨率为单位调整坐标,得到实际绘制到屏幕的效果。

再举一个例子,参考一个论坛的例子

如果你想在距离屏幕中心的1/4的位置画一个三角形,你有N种方法来实现。如syy64所说的,当你在距离屏幕中心1/4处看到一个三角形的时侯,实际上是一个空间的三角形投影到了屏幕上。

当你在OpenGL程序中定义了投影之后,glTranslatef的移动单位是可以与屏幕像素值发生关系的。举个例子,我定义透视投影如下:
gluPerspective(45,w/h,0.1,1000);

这时,屏幕相当于近裁剪面,视点在屏幕向外1分米的地方。当然注意!这里1分米跟我们现实世界的1分米还是不一样的,不是说,你把眼睛凑到屏幕前1分米就相当于视点所在位置了。那么,这里所定义的1分米到底是个什么概念呢?它实际上是虚拟世界坐标系中的1分米。

我们看第一个参数,45。表明视野在竖直方向的张角是45度,于是我们可以算出近裁剪面的高度:h=2*tan(22.5*PI/180)*0.1=0.082842712。
也就是说,近裁剪面约为8.3厘米高。换句话说,虚拟世界中的8.3厘米,就相当于我们的屏幕高,如果你的显示器是1024*768分辨率的话,那么虚拟世界中的8.3厘米就等价于768像素。这样,就将虚拟坐标单位和屏幕像素值建立起了联系。

如果你要在距离屏幕中心1/4的地方(假设为水平距离)画一个物体的话,就相当于在距离中心点1/4*1024=256像素的地方绘图。这时,在近裁剪面上,相当于移动了256/768*8.3=2.76厘米。
在虚拟三维世界中的任何物体,只要其形心的x坐标和z坐标满足如下关系:
|x|*0.1/|z|=0.0276,并且处于视锥之内的话,都将被画在距离屏幕中心1/4的地方。

OpenGL中移动单位中的‘单位’指什么的更多相关文章

  1. css单位中px和em,rem的区别

    css单位中分为相对长度单位.绝对长度单位. 今天我们主要讲解rem.em.px这些常用单位的区别和用法. px(绝对长度单位) 相信对于前端来说px这个单位是大家并不陌生,px这个单位,兼容性可以说 ...

  2. OpenGL 实现视频编辑中的转场效果

    转场介绍 转场效果是什么? 转场效果,简单来说就是两段视频之间的衔接过渡效果. 现在拍摄 vlog 的玩家越来越多,要是视频没有一两个炫酷的转场效果,都不好意思拿出来炫酷了. 那么如何在视频编辑软件中 ...

  3. OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图

    读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...

  4. OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?

    OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...

  5. HTML中Meta标签中http-equiv属性小结

    HTML中Meta标签中http-equiv的用法: <meta http-equiv="这里是参数" content="这里是参数值"> 1.Ex ...

  6. HTML中Meta标签中http-equiv属性

    HTML中Meta标签中http-equiv的用法: <meta http-equiv="这里是参数" content="这里是参数值"> 1.Ex ...

  7. SpringMVC项目中web.xml中的节点载入顺序问题

    SpringMVC项目中web.xml中的节点载入顺序问题,之前以为web.xml中就是一些配置信息,和节点的顺序没有关系.后来才发现初始化时的载入顺序是和节点的顺序相关的. 完整的web.xml文件 ...

  8. 面试中关于Java中涉及到知识点(转)

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  9. Knockout中ko.utils中处理数组的方法集合

    每一套框架基本上都会有一个工具类,如:Vue中的Vue.util.Knockout中的ko.utils.jQuery直接将一些工具类放到了$里面,如果你还需要更多的工具类可以试试lodash.本文只介 ...

  10. mysql数据库中指定值在所有表中所有字段中的替换

    MySQL数据库: 指定值在数据库中所有表所有字段值的替换(存储过程): 1.写一个存储过程,查指定数据库中所有的表名: CREATE PROCEDURE init_replace(in orig_s ...

随机推荐

  1. Jenkins进阶-邮件通知(9)

    公司内部每天大概会发布N多版本,也不能派员工一直去盯着版本发布,所以希望发布完成后通知相关人员,Jenkins最早采用通知机制就是短信和邮件,由于短信成本很高,所以我们一般在发布结束后会采用邮件.现在 ...

  2. LOJ 2587 「APIO2018」铁人两项——圆方树

    题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...

  3. MatConvNet中关于vl_simplenn_display的一些分析

    一.关于各层data size的分析 layer1:  floor((224-7)/2)+1=109 这里7是filter大小,2是stride layer4: floor((109+0+1-3)/2 ...

  4. .ajax向后台传递数组(转)

    js部分代码 //创建一个测试数组 var boxIds = new Array(); boxIds.push(12182); boxIds.push(12183); boxIds.push(1218 ...

  5. Jmeter --- 组件执行顺序与作用域

    一.Jmeter重要组件: 1)配置元件---Config Element: 用于初始化默认值和变量,以便后续采样器使用.配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同 ...

  6. 基于MVC4+EasyUI的Web开发框架形成之旅(4)--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  7. Kafka使用log.retention.hours改变消息端的消息保存时间

    数据存储的最大时间超过这个时间会根据log.cleanup.policy设置的策略处理数据,也就是消费端能够多久去消费数据log.retention.bytes和log.retention.hours ...

  8. Git-.gitignore配置

    .gitignore文件配置:keil工程文件类型模板 # reference to Keil->help->µVision User's Guide->Appendix->B ...

  9. Arduino在64位WIN7下无法安装驱动的解决办法

    1.获取权限 打开C:\Windows\System32\DriverStore\FileRepository,对着FileRepository文件夹,右键 >>属性 >>安全 ...

  10. 服务发现:Zookeeper vs etcd vs Consul 参考自http://dockone.io/article/667

    服务发现:Zookeeper vs etcd vs Consul [编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预 ...