• OpenGL ES 投影变换 Projection


    下面代码设置当前Matrix模式为Projection投影矩阵:

    gl.glMatrixMode(GL_PROJECTION);
    gl.glLoadIdentity();

    后续的坐标变换则针对投影矩阵。

    OpenGL ES可以使用两种不同的投影变换:透视投影(Perspective Projection)和正侧投影(Orthographic Projection)。

    正侧投影(Orthographic Projection)

    有些地方也翻译成正交投影。

    正交却是世界中的物体按照平行的光线投射到一张纸上(你的画布),仿佛被压缩在上面,无论这个物体在世界中多远,投射结果还是原来的大小, 2d 游戏多用此种投影。如下图:

    image

    正交投影的函数 有 glOrtho 和 glu 库的 gluOrth2D :
    glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
    gluOrth2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

    每个参数的意思如下图:

    image

    透视投影(Perspective Projection)

    透视比较接近我们现实的方式了,你的眼睛发出的光形成一个夹角,离你的眼睛越近,东西越大,范围越小;反之离眼睛越远,东西越小,视野越开阔。因此多用于 3D 中。如下图:

    tutorial_perspective

    OpenGL ES定义透视投影的函数为glFrustum():

    public void glFrustumf(float left,float right,float bottom,float top,float near,float far)

    20110702003

    在实际写代码时,Android OpenGL ES提供了一个辅助方法gluPerspective()可以更简单的来定义一个透视投影变换:

    public static void gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)

    fovy: 定义视锥的view angle. 视线角度
    aspect:  定义视锥的宽高比。
    zNear: 定义裁剪面的近距离。
    zFar: 定义创建面的远距离。

    image

    image

    fovy,可以理解成眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔;

    image

    对最佳视角fovy,有
    tan(fovy/2) = h/distance;   //h为物体在Y方向上的高度,distance为物体中心离视点的距离
    aspect = w/h;                   //w为物体在X方向上宽度,h意义同上

    http://www.imobilebbs.com/wordpress/?p=2025

  • 相关阅读:
    PHP查看IP时候能ping通
    mysql把查询到不一样的记录插入到另一张表中
    js本地预览图片
    redis 扩展下载
    mysql update select子查询
    mysql view视图的简单使用....
    两表联查关联字段我想查多个怎么办???
    两表联查是关联字段的值位数不一样时怎么办???
    使用PHP生成二维码(PHPQRCode)
    .net初学之SerialPort串口类
  • 原文地址:https://www.cnblogs.com/ghj1976/p/2473624.html
Copyright © 2020-2023  润新知