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 ...
随机推荐
- oracle参数文件与启动过程
oracle随系统启动而启动 cs65-64桌面版orcle-11.2.0.4 启动监听器,后台进程,OEM. 注意: 如果只做一和三,只能启动后台进程,监听器不启动,如果只做二和三,只能启动监听器, ...
- python-廖雪峰,map/reduce学习笔记
# _*_ coding:utf-8 _*_from functools import reduce def str2int(s): digits = {'0': 0, '1': 1, '2': 2, ...
- KiCad 国内下载镜像收集
KiCad 国内下载镜像收集 KiCad EDA 5.1.0 https://mirrors.dglinux.com/kicad/windows/stable/kicad-5.1.0_1-x86_64 ...
- SPA项目中,404页面 和 登陆页面 对应的路由,应该怎样控制?
SPA项目中,404页面 和 登陆页面 对应的路由,应该怎样控制? 可以这样做: 登陆之前,所有页面跳到 登陆页面:包括随便输入的路由地址. 登陆后,跳到相应页面:随便输入的.不存在的路由地址,才跳到 ...
- mqtt-jmeter
mqtt-jmeter https://github.com/emqtt/mqtt-jmeter mqtt-jmeter MQTT JMeter Plugin, it's used for testi ...
- 用shell通过jps -m来杀死进程
#!/bin/sh ### find pid jps=`jps -m` echo "$jps"|while read i do if[[ $i =~"agentTestT ...
- 多线程中的Lock小结
出处:http://www.cnblogs.com/DarrenChan/p/6528578.html#undefined 1.lock和synchronized的区别 1)Lock不是Java语言内 ...
- jira发送邮件报错
jira发送邮件的报错 1.安装完jira后,配置发送邮件出错具体报错如下: An error has occurred with sending the test email: com.atlass ...
- 《JavaScript设计模式与开发》笔记 4.闭包
1.变量的作用域 2.变量的生存周期 3.闭包更多作用 1.封装变量 2.延续局部变量寿命 4.闭包和面向对象设计 5.闭包和内存管理 1.变量的作用域 var func = function(){ ...
- VS2010与Qt5.1.0集成(非源码方式)
早就听说qt可以集成到VS中,就是一直没尝试过.一直在使用qt creator,也没觉得它有什么不好.可最近VS用多了,我发现一个qt creator中很不好的毛病,就是代码自动完成时,creator ...