摄影师调整好相机和被拍摄物体的位置角度(modelview) ,对好焦距(projection)后,就可以按下快门拍照了,拍好的照片可以在计算机上使用照片浏览器查看照片,放大,缩小,拉伸,并可以将照片显示窗口在屏幕上任意拖放。对应到3D绘制就是Viewport 变换,目前的显示器大多还是2D的,viewport(显示区域)为一个长方形区域,并且使用屏幕坐标系来定义:
OpenGL ES 中使用glViewport() 来定义显示视窗的大小和位置:
glViewport(int x, int y, int width, int height)
Android 缺省将viewport 设置成和显示屏幕大小一致。
如果投影变换的宽度/高度比 (aspect) 和最后的Viewport 的width/height 比不一致的话,最后显示的图形就可能需要拉伸以适应Viewport,从而可能造成图像变形。比如:现在的电视的显示模式有4:3 和 16:9 或是其它模式,如果使用16:9的模式来显示原始宽高比为4:3的视频,图像就有变形。、
Z
坐标变换
前面提到的modelview, projection 变换 同样应用于Z轴坐标,但和屏幕坐标系中x,y 坐标不同的时,在屏幕坐标系下 ,Android OpenGL ES 将z 坐标重新编码,它的值总会在0.0到1.0之间。作为深度depth 测试的依据。
我们在示例代码的OpenGLRenderer的onSurfaceChanged 使用和屏幕一样大小的区域作为Viewport,你也可以通过glViewport将视窗设成屏幕的局部某个区域。
并且可以看到透视投影的aspect 为width/height ,因此最后的图形不会有变形:
public void onSurfaceChanged(GL10 gl, int width, int height) {
// Sets the current view port to the new size.
gl.glViewport(0, 0, width, height);
// Select the projection matrix
gl.glMatrixMode(GL10.GL_PROJECTION);
// Reset the projection matrix
gl.glLoadIdentity();
// Calculate the aspect ratio of the window
GLU.gluPerspective(gl, 45.0f,
(float) width / (float) height,
0.1f, 100.0f);
// Select the modelview matrix
gl.glMatrixMode(GL10.GL_MODELVIEW);
// Reset the modelview matrix
gl.glLoadIdentity();
}
分享到:
相关推荐
在OpenGL中读取OBJ模型,并在窗口中设置四个视图,每个视图分别显示一个三维模型,鼠标左、右键分别控制模型的平移和旋转操作。可以作为图形编程练习的重要参考。
本节介绍 Ext的Border布局以及如何创建一个Viewport。 1、Viewport介绍: Viewport 是一类特殊的容器。它创建后会自动填充到整个页面区域,并能自动适应页面缩放。一般作为用用程序全局容器使用。 2、Border布局...
这是用MFC编写的使用openGL的视口代码。 CChildView::CChildView() 构造函数 CChildView::~CChildView() 析构函数 BEGIN_MESSAGE_MAP(CChildView,CWnd ) 消息映射 BOOL CChildView::PreCreateWindow(CREATESTRUCT& ...
viewport.jquery 关于 视口是简单但方便的jQuery插件,它添加了方法和CSS选择器来检查元素是否在特定视口中。 此外-即使不是亲属,您也可以检查两个单独元素的位置关系。 插件使用确定元素位置,因此请确保它满足您...
利用VC编写的OpenGL MFC读取显示点云应用程序开发向导的源文件工程,这里是Custom Appwizard,只需把Debug下的"MFC OpenGL.awx"添加到"C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Template"目录下,...
viewport-mercator-project, 利用墨卡托投影的地图变换器 viewport-mercator-project | 文档支持韦伯投影的投影和相机工具。 它的核心是一个转换到地图坐标( 例如 )的工具。 ,) screen屏幕坐标和背面。是谁?专门为...
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤 到很小的窗口中(这样会破坏没有针对手机浏览器优化的网页的布局)...
NULL 博文链接:https://wenzongliang.iteye.com/blog/2200661
abaqus python实现对所计算的三维模型,自动遍历,寻找最大应力值
viewport响应式模板
该程序是基于HelixToolkit.wpf,实现了3D模型的缩放旋转平移。
从pixi-viewport v3迁移到v4 视口需要导入或要求如下: import { Viewport } from 'pixi-viewport'// orconst Viewport = require ( 'pixi-viewport' ) . Viewport 插件已移至其自己的对象: // viewport....
Flare论文阅读总结(部分有参考知乎博主,侵删),本资源仅供本人使用
Scroll Viewport 主题开发的 Gulp 插件将主题资源直接上传到 Scroll Viewport。 在本地 IDE 中开发滚动视口主题时,这很有用。 在这种情况下,Gulp 可以查看资源,并自动将构建结果上传到 Scroll Viewport。 快速...
视口 ##用法 meteor add dispatch:viewport Viewport('page').goTo('login', { myData: true, transition: Viewport.Transition.slideX }, function () { // transition is done }); 受启发
Using npmnpm install --save-dev nuxt-viewport# Using yarnyarn add --dev nuxt-viewport 添加nuxt-viewport的modules的部分nuxt.config.js { modules : [ [ 'nuxt-viewport' , { /* Viewport options */ } ] , ]}...
绘图设备逻辑坐标与客户区坐标相互间转换转换!
1、使用meta标签:viewport H5移动端页面自适应普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的,但是各设备对该标签的解释方式及支持程度不同造成了不能兼容所有浏览器或系统。 viewport 是用户...
3D视图自动切换捕捉脚本 Viewport Auto-Snap
PyQt(Python+Qt)学习随笔:QAbstractScrollArea的viewPort(视口)理解.rar