美文网首页Android OpenGLES笔记
OpenGLES坐标、模型矩阵(ModelViewMatrix)

OpenGLES坐标、模型矩阵(ModelViewMatrix)

作者: cain_huang | 来源:发表于2017-06-03 23:40 被阅读306次

    OpenGL有六种坐标:

    物体或模型坐标系(Object or Model Coordinates)

    世界坐标系(World Coordinates)

    眼坐标或相机坐标(Eye (or Camera) Coordinates)

    裁剪坐标系(Clip Coordinates)

    标准设备坐标系(Normalized Devices Coordinates)

    屏幕坐标系(Window (or Screen) Coordinates)

    备注 :除了以上坐标系,还有一个假想坐标系——纹理坐标系,这个坐标系不存在的,其实是一系列矩阵变换的结果,比如它能使顶点从物体或模型坐标变换到世界坐标系

    从 Object Coordinates 到 World Coordinates 再到Camera Coordinates的变换,在OpenGL中统一称为model-View转换,初始化的时候,Object Coordinates 和 World Coordinates 还有Camera Coordinates坐标重合在原点,变换矩阵都为Identity,所以在OpenGL中用glLoadIdentity() 初始化变换矩阵栈。model-view matrix 转换points, vectors到camera坐标系

    OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区(Viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

    常用到的集中坐标系:

    世界坐标、物体坐标、设备坐标、眼坐标、纹理坐标

    世界坐标系:

    是针对OpenGL来说明的,即三维坐标系x,y,z

    右手笛卡尔坐标系,水平向右为x轴,向上为y轴,屏幕向外为z轴

    OpenGL提供了 glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

    坐标变换矩阵栈(ModelView)

    用来存储一系列的变换矩阵,栈顶就是当前坐标的变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。

    VertexData —>(Object Coordinates)—>ModelViewMatrix —>(Eye Coordinates)—> ProjectionMatrix —>(Clip Coordinates)—>Divide by w —>(Normalized Device Coordinates)—>ViewportTransform—>WindowCoordinates—>

    纹理坐标系

    纹理是图片,视频等格式的一种渲染方式,图片只有通过纹理才能加载到GLES中

    因此纹理坐标系是图片,视频等在手机屏幕上的坐标系,即U,V也有叫ST的。

    应用初始化时,UV坐标与三维坐标系重合,可以选择绘制的模式,绘制模式包括点,线,面,且都是坐标集合里进行顺序绘制的。

    物体坐标系

    物体坐标系是以物体的某一个点为原点来建立的三维坐标系(世界坐标系)。仅针对该物体。物体放到场景中时,各部分经历的坐标变换矩阵相同,相对位置不变,所以可视为一个整体

    眼坐标系或相机坐标系

    以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。

    裁剪坐标系

    由眼坐标可知,OpenGL管道首先会将目标从世界坐标变换到眼坐标,然后对视线范围外的部分进行裁剪。

    裁剪过程中用到投影变换矩阵栈(ProjectionMatrix),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标

    我们上面说到了ModelViewMatrix 与ProjectionMatrix两个矩阵栈,那矩阵栈是怎么切换的呢?

    用函数:glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。

    紧接着glMatrixMode()就是初始化矩阵,我们在上面也讲到,所有矩阵都为Identity,所以用方法glLoadIdentity()初始化矩阵。

    相关文章

      网友评论

        本文标题:OpenGLES坐标、模型矩阵(ModelViewMatrix)

        本文链接:https://www.haomeiwen.com/subject/szamfxtx.html