世界坐标系:

  • 在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角坐标为(1,1)。


    openGL使用右手坐标
    从左到右,x递增
    从下到上,y递增
    从远到近,z递增

当前绘图坐标系:

  • 是绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()等对当前绘图坐标系进行平移、伸缩、旋转变换之后,世界坐标系和当前绘图坐标系不再重合。注意,这里的平移旋转是将当前绘图坐标系看做一个整体在世界坐标系中进行旋转平移。然后,改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相对当前绘图坐标系来讲的。

其中四种坐标经常要在程序中用到:世界坐标,物体坐标,设备坐标和眼坐标。

  • 1、世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。
    将物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换。OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

    • OpenGL中有一个坐标变换矩阵栈(ModelView),栈顶就是当前坐标变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL中的坐标变换都是通过矩阵运算完成的,与图形学课本的描述完全一致。要注意的是变换中的矩阵乘法是左乘,而矩阵乘法与算术乘法不同,不符合交换律(万一不明白去看矩阵代数书好了)。

    • glTranslate*(x,y,z):平移,参数为各轴向的移动量。

    • glRotate(d,x,y,z):旋转,第一个参数为转动的度数,后三个参数表明是否绕该轴旋转。通常x,y,z中只有一个为1,其余为0,用连续几条旋转命令完成复杂旋转。由于矩阵运算的左乘特点,旋转命令的顺序与旋转动作的顺序正好相反。
  • 2、物体坐标是以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

  • 3、眼坐标是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。同样的,有投影变换矩阵栈(Projection),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标。前面提到过的视见体设定其实就是在建立该矩阵。

  • 4、设备坐标:OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。值得一提的是,OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

    对应代码:

package com.example.hejunlin.openglcoordinate;import android.opengl.GLSurfaceView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {private GLSurfaceView mSurfaceView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mSurfaceView = new GLSurfaceView(this);mSurfaceView.setRenderer(new MyGLRenderer());setContentView(mSurfaceView);}@Overrideprotected void onResume() {super.onResume();mSurfaceView.onResume();}@Overrideprotected void onPause() {super.onPause();mSurfaceView.onPause();}
}

Renderer

package com.example.hejunlin.openglcoordinate;import android.opengl.GLES31;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.opengl.Matrix;
import android.util.Log;import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;/*** Created by hejunlin on 2017/3/13.*/public class MyGLRenderer implements GLSurfaceView.Renderer {private Coordinate coordinate;private float mAngle = 45;public MyGLRenderer() {coordinate = new Coordinate();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {gl.glClearColor(255.0f, 255.0f, 255.0f, 1.0f);gl.glClearDepthf(1.0f);gl.glEnable(GL10.GL_DEPTH_TEST);gl.glDepthFunc(GL10.GL_LEQUAL);gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);gl.glShadeModel(GL10.GL_SMOOTH);gl.glDisable(GL10.GL_DITHER);}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {if (height == 0) {height = 1;}float aspect = (float) width / height;gl.glViewport(0, 0, width, height);gl.glMatrixMode(GL10.GL_PROJECTION);gl.glLoadIdentity();GLU.gluPerspective(gl, 45, aspect, 0.1f, 100.0f);gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onDrawFrame(GL10 gl) {Log.d("AAA" , ">> onDrawFrame mAngle " + mAngle);// 画背景颜色GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT | GLES31.GL_DEPTH_BUFFER_BIT);gl.glLoadIdentity();gl.glTranslatef(0.0f, 0.3f, -2.0f);mAngle ++;
//        gl.glRotatef(mAngle,1.0f,1.0f,1.0f);coordinate.draw(gl);}}

Coordinate

package com.example.hejunlin.openglcoordinate;import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;import javax.microedition.khronos.opengles.GL10;/*** Created by hejunlin on 2017/3/13.*/public class Coordinate {private FloatBuffer vertexsBuffer;private FloatBuffer colorsBuffer;private ByteBuffer indicesBuffer;private float vertexs[] = {0.0f, 0.0f, 0.0f,1.0f, 0.0f, 0.0f,0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f,0.0f, 0.0f, 0.0f,0.0f, 0.0f, 1.0f};private float colors[] = {1.0f, 0.0f, 0.0f, 1.0f,1.0f, 0.0f, 0.0f, 1.0f,0.0f, 1.0f, 0.0f, 1.0f,0.0f, 1.0f, 0.0f, 1.0f,0.0f, 0.0f, 1.0f, 1.0f,0.0f, 0.0f, 1.0f, 1.0f};private byte indices[] = {0, 1, 2};public Coordinate() {ByteBuffer vbb = ByteBuffer.allocateDirect(vertexs.length * 4);vbb.order(ByteOrder.nativeOrder());vertexsBuffer = vbb.asFloatBuffer();vertexsBuffer.put(vertexs);vertexsBuffer.position(0);ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4);cbb.order(ByteOrder.nativeOrder());colorsBuffer = cbb.asFloatBuffer();colorsBuffer.put(colors);colorsBuffer.position(0);}public void draw(GL10 gl) {gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexsBuffer);gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorsBuffer);gl.glLineWidth(9);gl.glDrawArrays(GL10.GL_LINES, 0, vertexs.length / 3);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}
}

通过变换 gl.glTranslatef(0.0f, 0.3f, -2.0f)中,前两个参数,来看下变换后效果。
下图坐标:(0.0f, 0.0f, -2.0f)

先换x,变成(0.3f, 0.0f, -2.0f),对应图如下:

换x,变成(-0.3f, 0.0f, -2.0f),对应图如下:

换y,变成(0.0f, 0.3f, -2.0f),对应图如下:

换y,变成(0.0f, -0.3f, -2.0f),对应图如下:

void glTranslatef(GLdouble x,
         GLdouble y,
         GLdouble z);

参数说明:
x,y,z:分别指定沿x,y,z轴方向的平移分量。

重点就是沿着x,y,z轴移动。
注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量。

关于 OpenGL坐标系之间的转换,可参考
http://blog.csdn.net/sac761/article/details/52179585

OpenGL ES总结(二)OpenGL坐标变换之平移及旋转相关推荐

  1. 计算机图形与OpenGL学习五(二维几何变换1.平移、旋转、缩放)

    二维几何变换(平移.旋转.缩放) 本章涉及数学变换比较多,代码是次要的,数学理论可自己推导一下. [二维平移] 通过将二维量加到一个点的坐标上来生成一个新的坐标位置,可以实现一次平移.将平移距离加到原 ...

  2. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  3. 【OpenGL ES】二维图形绘制

    目录 OpenGL ES 学习--2D 着色器语言基础知识 绘制纯色背景 JAVA版本 C++版本 绘制圆点.直线.三角形 JAVA版本 C++版本 绘制彩色三角形 JAVA版本 C++版本 绘制纯色 ...

  4. 二维图形平移变换c语言程序,[转载]计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换...

    参考课堂教学中关于模型变化的讲解,编写对一个三角形分别实现平移.缩放.旋转等变化的源码及效果图.请以该例为蓝本,实现3题的代码编写. 如下的几幅图,第一幅就是在给出的代码部分进行修改,将GL_FLAT ...

  5. 【OpenGL ES】 Android OpenGL ES -- 透视投影 和 正交投影

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46680803 源码下载 : http://download.csdn.net/det ...

  6. android opengl流程,【Android OpenGL ES】Android Opengl ES创建流程

    在android 1.0rc2 sdk中,提供了以下包支持Opengl ES 编程: 一.openglES包 android.opengl Class: GLDebugHelper:用于调试OpenG ...

  7. 坐标变换(平移、旋转与缩放)

    本文主要参考Coordinate Systems and Transformations(坐标系及其变换). 主要内容 坐标系与广义坐标系 坐标变换 仿射变换 旋转.平移.伸缩与剪切 绕任意轴旋转 注 ...

  8. WebGL 实践篇(三)—— 二维图形的平移、旋转、缩放

    一 平移 (1)平移直接体现在代码当中 在二维当中,平移相当于就是改变x,y的位置. function setRectangle(gl, x, y, width, height) {var x1 = ...

  9. 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称

    [实验内容] 以矩阵运算为数学基础,采用旋转.平移.缩放.对称等基本几何变换,对一简单的二维图形做变换. [实验步骤] 1. 编写二维图形基本变换(包括旋转.平移.缩放.对称)的通用子程序: 2. 以 ...

  10. 图形学 ---- 二维几何变换(二维图形矩阵平移,旋转,缩放)

    二维图形几何变换,矩阵计算 前言:对于一个图形的几何变换,对应的是操作到图形中的每一个点! 即对每一个点做出相应的几何变换.比如平移,就是对二维图形的每个点都平移相同的距离:旋转则是对每一个点,基于基 ...

最新文章

  1. 20张图带你到HBase的世界遨游
  2. APK瘦身记,怎样实现高达53%的压缩效果
  3. 7-19上午刷题未知点集合
  4. Linux文件查询笔记
  5. URL 路径长度限制(错误:指定的文件或文件夹名称太长)
  6. 关于 WSGI、uwsgi和uWSGI的区别及基于 uWSGI和gunicorn 部署python web 简述
  7. Simpsons’ Hidden Talents(HDU-2594)
  8. bootstrapV5+(资源篇)
  9. centos7系统管理和运维实战
  10. JAVA的Random类介绍
  11. 使用iToolab UnlockGo for Mac如何绕过屏幕时间密码
  12. android 类似qq表情,android 实现类似qq表情
  13. 电磁场计算的服务器性能指标,有限公式电磁场数值计算理论与性能
  14. android最新系统排行,四大安卓系统排名,Flyme最好?
  15. FPS游戏:封装外部D3D透视模块
  16. 佳能7660cdn 评价_佳能LBP7660Cdn说明书
  17. 论坛.newreply.php,discuz!论坛帖、删帖加减金钱值后台设定For D25sp1 4.3日整理版
  18. 计算机硬件基础英语ppt,计算机英语 第一单元 计算机硬件 computer hardware.ppt
  19. GPS GLONASS数据文件类型解析
  20. excel 分组求和

热门文章

  1. 诚毅学院的计算机专业,诚毅学院计算机专业JAVA题目
  2. mysql 8.X主从复制
  3. java自动识别文件编码格式
  4. 时间格式 asp.net
  5. (CVPR2019)图像语义分割(17)-DFANet:用于实时语义分割的深层特征聚合网络
  6. c++中#pragma用法详解
  7. 三维重建系列之COLMAP: Structure-from-Motion Revisited
  8. yolov3聚类自己数据的anchor box
  9. video标签详解(转载)
  10. Unity 阴影的制作方式