OpenGL中怎么把世界坐标系变成屏幕坐标系
对这个3D坐标手动进行OpenGL的四个变换,得到的结果就是屏幕上的像素坐标。
前三个变换(Model, View, Projection)都是4x4矩阵,操作对象是四维向量,所以需要把(100, 100, 100)补上w分量,变成(100, 100, 100, 1)。
然后把前三个变换的矩阵依次左乘到这个向量上,得到的四维向量做齐次除法(所有分量都除以w分量),然后用其中x和y分量再进行第四个变换(Viewport),就得到屏幕坐标。 打个比方,比如如果你设置各个变换的代码是
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate3f(0, 0, 100);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(100, 100, 400, 400); 那么ModelView矩阵是一个平移(前三行代码)(OpenGL里model变换和view变换用同一个矩阵表示,可以理解为这两个矩阵已经乘在一起了):
1 0 0 0
0 1 0 0
0 0 1 100
0 0 0 1 Projection矩阵就是单位矩阵(中间两行代码):
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1 最后一行设置viewport变换,把(-1, -1)到(1, 1)这个矩形映射到(100, 100)到(500, 500),相当于缩放200倍后平移(+300, +300)。 施加变换的过程如下:
①先把(100, 100, 100)变成四维向量(补上w分量,成为齐次坐标),变成(100, 100, 100, 1),
②然后把第一个矩阵左乘到这个向量上,得到(100, 100, 200, 1),
③然后再把第二个矩阵左城到这个新向量上,得到的仍是(100, 100, 200, 1),再把它转化回三维向量,方法是所有分量都除以w分量1,所以得到(100, 100, 200)。
④最后取xy分量(100, 100),进行最后一个变换(viewport),放大200倍后平移(+300, +300),变成(20300, 20300)。这就是屏幕上的坐标。当然这个位置肯定是在屏幕能显示的区域之外了。
实际上进行viewport变换之前,因为xy分量是(100, 100)已经超出(-1, -1)到(1, 1)的范围,所以在这一步就已经可以确定这个像素不用画了,肯定在屏幕之外。
OpenGL中怎么把世界坐标系变成屏幕坐标系的更多相关文章
- u3d之世界坐标系,屏幕坐标系,视口坐标系,如何获取物体距离摄像机的距离
世界坐标系就是unity的左手坐标系 屏幕坐标系是Game视图相机拍摄的场景坐标系,左下角(0,0),右上角(Screen.width,Screen.height),单位是像素.Z的位置是以相机的世界 ...
- OpenGL中坐标系的理解(一)
在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE. 以下主要描述GL_MODEL ...
- OpenGL中各种坐标系的理解[转]
OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...
- 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程
转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模 ...
- OpenGL中各种坐标系的理解
转载:https://blog.csdn.net/meegomeego/article/details/8686816 OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系以屏幕中心为原 ...
- cocos2d-x 屏幕坐标系和OPenGL坐标系转换
转自:http://home.cnblogs.com/group/topic/57609.html cocos2d坐标系(OPenGL坐标系):以左下角为原点,x向右,y向上 屏幕坐标系(androi ...
- OPenGL中三维图形的矩阵变换
对于二维的图形开发,拿简单的图片显示来说,我们主要的目的:就是在一块显示buffer中,不停的把每个像素进行着色,然后就可以绘制出来了.为了速度,很多其他的加速方法,但原理基本上就是这样了. 很直观, ...
- OpenGL中glPushMatrix和glPopMatrix的原理
glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...
- OpenGL中的拾取模式( Picking)
1. Opengl中的渲染模式有三种:(1)渲染模式,默认的模式:(2)选择模式, (3)反馈模式.如下 GLint glRenderMode(GLenum mode) mode可以选取以下三种模式之 ...
随机推荐
- A brief introduction to weakly supervised learning(简要介绍弱监督学习)
by 南大周志华 摘要 监督学习技术通过学习大量训练数据来构建预测模型,其中每个训练样本都有其对应的真值输出.尽管现有的技术已经取得了巨大的成功,但值得注意的是,由于数据标注过程的高成本,很多任务很难 ...
- linux实验一 双系统安装
(一)首先来简要了解一些linux的概念! 1.发行版本和内核版本的区别与联系:linux发行版本是"内核版本+一系列挂载软件"的集合体,光是一个内核版本是无法当做操作系统运行的. ...
- 错误代码和UNICODE编程
程序错误处理 一般错误返回的数据类型有VOID BOOL HANDLE PVOID LONG/DWORD 返回值哪些代表成功和错误需查文档 错误码和解释存放在WinError.h中 使用GetLast ...
- bzoj3142 luogu3228 HNOI2013 数列
这题好没意思啊,怀疑拉不开区分度. 题意:求一个递增序列,每两个相邻数字之间的差值不超过m,最后一个值不能大于n. 分析:网上好多人用了差分,我没想到.然后YY了一发生成函数. 考虑构造生成函数G(x ...
- java正则匹配并提取字串
Pattern p = Pattern.compile("\\(.*\\)"); Matcher m = p.matcher("1.2.0(23)"); if( ...
- JDK1.8源码(三)——java.lang.String 类
String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类. 1.String 类的定义 public final class ...
- Java设计模式(四)Builder建造者模式
一.场景描述 建造者模式同工厂模式.抽象工厂模式一样,用于创建继承类对象. 工厂模式:http://www.cnblogs.com/mahongbiao/p/8618970.html 抽象工厂模式:h ...
- 快速搭建CentOS+ASP.NET Core环境支持WebSocket
环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...
- 笔记:Spring Cloud Eureka 常用配置及说明
配置参数 默认值 说明 服务注册中心配置 Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean ...
- 多进程浏览器、多线程页面渲染与js的单线程
线程与进程 说到单线程,就得从操作系统进程开始说起.在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位.任务调度采用的是时间片轮转的抢占式调度方式,而进程 ...