OpenGL ES图形库最终的结果是在二维平面上显示3D物体(常称作模型Model)这是因为目前的打部分显示器还只能显示二维图形。但我们在构造3D模型时必须要有空间现象能力,所有对模型的描述还是使用三维坐标。也就是使用3D建模,而有OpenGL ES库来完成从3D模型到二维屏幕上的显示。
这个过程可以分成三个部分:
- 坐标变换,坐标变换通过使用变换矩阵来描述,因此学习3D绘图需要了解一些空间几何,矩阵运算的知识。三维坐标通常使用齐次坐标来定义。变换矩阵操作可以分为视角(Viewing),模型(Modeling)和投影(Projection)操作,这些操作可以有选择,平移,缩放,正侧投影,透视投影等。
- 由于最终的3D模型需要在一个矩形窗口中显示,因此在这个窗口之外的部分需要裁剪掉以提高绘图效率,对应3D图形,裁剪是将处在剪切面之外的部分扔掉。
- 在最终绘制到显示器(2D屏幕),需要建立起变换后的坐标和屏幕像素之间的对应关系,这通常称为“视窗”坐标变换(Viewport) transformation.
如果我们使用照相机拍照的过程做类比,可以更好的理解3D 坐标变换的过程。
- 拍照时第一步是架起三角架并把相机的镜头指向需要拍摄的场景,对应到3D 变换为viewing transformation (平移或是选择Camera )
- 然后摄影师可能需要调整被拍场景中某个物体的角度,位置,比如摄影师给架好三角架后给你拍照时,可以要让你调整站立姿势或是位置。对应到3D绘制就是Modeling transformation (调整所绘模型的位置,角度或是缩放比例)。
- 之后摄影师可以需要调整镜头取景(拉近或是拍摄远景),相机取景框所能拍摄的场景会随镜头的伸缩而变换,对应到3D绘图则为Projection transformation(裁剪投影场景)。
- 按下快门后,对于数码相机可以直接在屏幕上显示当前拍摄的照片,一般可以充满整个屏幕(相当于将坐标做规范化处理NDC),此时你可以使用缩放放大功能显示照片的部分。对应到3D绘图相当于viewport transformation (可以对最终的图像缩放显示等)
下图为Android OpenGL ES坐标变换的过程:
- Object Coordinate System: 也称作Local coordinate System,用来定义一个模型本身的坐标系。
- World Coordinate System: 3d 虚拟世界中的绝对坐标系,定义好这个坐标系的原点就可以用来描述模型的实现的位置,Camera 的位置,光源的位置。
- View Coordinate System: 一般使用用来计算光照效果。
- Clip Coordinate System: 对3D场景使用投影变换裁剪视锥。
- Normalized device coordinate System (NDC): 规范后坐标系。
- Windows Coordinate System: 最后屏幕显示的2D坐标系统,一般原点定义在屏幕左上角。
对于Viewing transformation (平移,选择相机)和Modeling transformation(平移,选择模型)可以合并起来看,只是应为向左移动相机,和相机不同将模型右移的效果是等效的。
所以在OpenGL ES 中,
- 使用GL10.GL_MODELVIEW 来同时指定viewing matrix 和modeling matrix.
- 使用GL10.GL_PROJECTION 指定投影变换,OpenGL 支持透视投影和正侧投影(一般用于工程制图)。
- 使用glViewport 指定 Viewport 变换。
此时再看看下面的代码,就不是很难理解了,后面就逐步介绍各种坐标变换。
分享到:
相关推荐
Android OpenGL ES 简明开发教程四:3D 坐标变换
Android OpenGL ES (二) 绘制三维/空间坐标系 透明的立体图加三维向量和xyz坐标轴 源代码包,直接倒入eclips修改packadge便可用
Android OpenGL ES三维坐标系及坐标变换初步
Android OpenGL ES 简明开发教程
Android OpenGL ES 开发教程(19):绘制迷你太阳系
使用OpenGL实现三维坐标的鼠标拣选,本文提出并实现一种用于三维坐标拣选的RIP(Ray-Intersection-Penetration)方法。介绍了如何在已经渲染至窗口的三维场景中,使用鼠标或者相关设备拣选特定三维对象的方法。此方法...
本例实现在三维的坐标系中绘制图形,可以从COM口接收数据,并根据接收的数据在三维的坐标系中绘制图像。同时实现了把三维的曲线投影到三个平面上。
自制的基于MFC、OpenGL平台的三维坐标图程序,在vc2008编译通过
ubuntu16.04 下在qt 5.9.0 下采用opengl 利用glut画3维坐标系
Android开发之OpenGL ES教程,Android开发之OpenGL ES教程,Android开发之OpenGL ES教程,Android开发之OpenGL ES教程,Android开发之OpenGL ES教程,Android开发之OpenGL ES教程,Android开发之OpenGL ES教程,...
Android OpenGL ES 简明开发真正的3D图 ...Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.microedition.khronos.opengles ,java.nio 等几个包中
《OpenGL ES应用开发实践指南:Android卷》是一本系统的OpenGL三维游戏和动态壁纸开发指南。由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还...
《OpenGL ES应用开发实践指南:Android卷》是一本系统的OpenGL三维游戏和动态壁纸开发指南。由资深Android开发专家根据OpenGLES2.0版本撰写,不仅系统地讲解了OpenGLES的核心概念、技术,以及Android的图形机制,还...
如题,Android 3D游戏开发技术宝典:OpenGL ES 2.0书中的全部源代码。该书由浅入深的讲解了OpenGL ES 2.0在3D游戏开发中的各个方面,还给出了BN赛艇、火力篮球、夜鹰行动三个经典游戏的全部源代码。
- 在OpenGL进行3D可视化,绘制网格形式的坐标系则能更清晰的展示所画图形位置。由于OpenGL本身并没有绘制文字的功能,所以想要显示刻度标签或者一些其他标签需要自己手撸代码。Qt的QOpenGLWidget可以较方便的解决这...
OpenGL 计算机图形学 三维建模 坐标变换
Android OpenGL ES 简明开发教程相关源码添加颜色 简单的上色方法叫做顶点着色(Vertxt coloring),可以使用单色,也可以定义颜色渐变或者使用材质(类同于二维图形中各种Brush类型)。
Android OpenGL ES 2.0 开发教程 从入门到精通和Demo(内容详细、简单,易学)
OpenGL通过相机模拟可以实现计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换等,同时,OpenGL还实现了矩阵堆栈等。 为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一...