OpenGL中移动单位中的‘单位’指什么
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中移动单位中的‘单位’指什么的更多相关文章
- css单位中px和em,rem的区别
css单位中分为相对长度单位.绝对长度单位. 今天我们主要讲解rem.em.px这些常用单位的区别和用法. px(绝对长度单位) 相信对于前端来说px这个单位是大家并不陌生,px这个单位,兼容性可以说 ...
- OpenGL 实现视频编辑中的转场效果
转场介绍 转场效果是什么? 转场效果,简单来说就是两段视频之间的衔接过渡效果. 现在拍摄 vlog 的玩家越来越多,要是视频没有一两个炫酷的转场效果,都不好意思拿出来炫酷了. 那么如何在视频编辑软件中 ...
- OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图
读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...
- OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?
OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...
- HTML中Meta标签中http-equiv属性小结
HTML中Meta标签中http-equiv的用法: <meta http-equiv="这里是参数" content="这里是参数值"> 1.Ex ...
- HTML中Meta标签中http-equiv属性
HTML中Meta标签中http-equiv的用法: <meta http-equiv="这里是参数" content="这里是参数值"> 1.Ex ...
- SpringMVC项目中web.xml中的节点载入顺序问题
SpringMVC项目中web.xml中的节点载入顺序问题,之前以为web.xml中就是一些配置信息,和节点的顺序没有关系.后来才发现初始化时的载入顺序是和节点的顺序相关的. 完整的web.xml文件 ...
- 面试中关于Java中涉及到知识点(转)
本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...
- Knockout中ko.utils中处理数组的方法集合
每一套框架基本上都会有一个工具类,如:Vue中的Vue.util.Knockout中的ko.utils.jQuery直接将一些工具类放到了$里面,如果你还需要更多的工具类可以试试lodash.本文只介 ...
- mysql数据库中指定值在所有表中所有字段中的替换
MySQL数据库: 指定值在数据库中所有表所有字段值的替换(存储过程): 1.写一个存储过程,查指定数据库中所有的表名: CREATE PROCEDURE init_replace(in orig_s ...
随机推荐
- python super()函数
super()函数是用来调用父类(超类)的一个方法 super()的语法: python 2 的用法: super(Class, self).xxx # class是子类的名称 class A(ob ...
- python-廖雪峰,map/reduce学习笔记
# _*_ coding:utf-8 _*_from functools import reduce def str2int(s): digits = {'0': 0, '1': 1, '2': 2, ...
- webpack报错:Module build failed (from ./node_modules/babel-loader/lib/index.js): Error: Cannot find module 'babel-preset-env' from '...' - Did you mean "@babel/env"?
webpack报错:Module build failed (from ./node_modules/babel-loader/lib/index.js): Error: Cannot find mo ...
- chrome自定义ua(批处理文件方式)
新建bat文件,输入如下代码: @echo off start chrome.exe --user-agent="你自定义的ua字符串" EXIT 保存后运行bat文件. 这个时候 ...
- java-普通类文件@Autowired自动注入为null
@Autowired注解在非Controller中注入为null 1.配置文件(类文件所在的包) <context:component-scan base-package="net.n ...
- windbg条件断点总结
1 . 条件断点是断点命令 ( bp 或者 bu ) 与j命令或者.if命令一起使用的,后面跟着一个gc命令 0:000> bp Address "j (Condition) 'O ...
- SpringMVC和Struts是线程安全的吗?为什么?
线程不安全的.(其实我觉得回答为:存在线程安全问题 这样比较好点) 原因如下: 第一点,先理解为何线程不安全 1 struts1的action是单例的,所以存在线程安全问题(struts2是多例的,不 ...
- 在Centos7上安装配置ss-libev Proxifier
http://note.youdao.com/noteshare?id=6f768652c33a64d6b8935eb08b10a213 servier:ss-libev client:ss+Prox ...
- WyBox使用shell脚本检测io口是否正常
1. 修改mt7620a.dts文件,把gpio管脚复用全都定义为通用gpio /dts-v1/; /include/ "mt7620a.dtsi" / { compatible ...
- JavaScript之WebSocket技术详解
概述 HTTP协议是一种无状态协议,服务器端本身不具有识别客户端的能力,必须借助外部机制,比如session和cookie,才能与特定客户端保持对话.这多多少少带来一些不便,尤其在服务器端与客户端需要 ...