zoukankan      html  css  js  c++  java
  • Opengl_es模型矩阵位置:glFrustumx与glTranslatef参数的相互影响立方体旋转特效

    Opengl_es模型矩阵位置:glFrustumxglTranslatef参数的相互影响--立方体旋转特效

    ES中没有函数glPerspectivef

     

    只有glFrustumx这样的函数。

     

    GL_API void GL_APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);

     

    //near far 参数均为正值,left为负值,right为正值,top为正值,bottom为负值

    //left(right)bottom(top)保持屏幕的纵横比关系

     

    做立方体旋转特效,要使立方体的当前面刚好占满屏幕,则立方体的当时的前面的Z轴深度等于glFrustumxzNear参数值

     

    假如设置glFrustumx(glF(-5.0f), glF(5.0f), glF(-3.0f), glF(3.0f), glF(zz),glF(1000.0f));

    (屏幕长宽比53

     

    立方体模型的前面和右侧面坐标

    GLfixed pCubeVertex_front[]={

    glF(-5.0f),  glF(-3.0f), glF(5.0f), //0  (Front) 左下,,,

    glF(5.0f),   glF(-3.0f), glF(5.0f), //1 右下

    glF(5.0f),   glF(3.0f),  glF(5.0f), //2 右上

    glF(-5.0f),  glF(3.0f),  glF(5.0f), //3 左上

     

    };

    GLfixed pCubeVertex_right[]={

    glF(5.0f),   glF(-3.0f), glF(-5.0f), //16  (Right)

    glF(5.0f),   glF( 3.0f), glF(-5.0f), //17

    glF(5.0f),   glF( 3.0f), glF( 5.0f), //18

    glF(5.0f),   glF(-3.0f), glF( 5.0f), //19

    };

     

    要使立方体前面刚好占满屏幕

    sz=-(zz+5.0f);

    设置glTranslatef(0.0f,0.0f,sz); 

     

     

    zz为投影模型矩阵near参数值,加上5.0f是立方体中心点到立方体前面的距离(glTranslatef设置的是立方体坐在矩阵的中心)

     

    在旋转的时候 ,如果sz值不变,会看不到立方体的角,因为立方体旋转时有部分已经不在nearfar之间

    要一直看到完整的立方体,应在旋转的时候移动模型矩阵,加大sz的绝对值,也就是往屏幕深处拉模型矩阵(立方体)。

     

    最简单的处理是 如果立方体向左转的话,zz加上立方体中心点到右棱边的距离aa*a=3*3+5*5

     

    旋转的时候如果加上的值从5.0f渐变到a,效果更好。

     

     

    备注1:做立方体旋转,简单做法是glRotatef(yrot,0.0f,1.0f,0.0f); // Y轴旋转

           如果向左转,则yrot的值在一个循环中减满90度,比如循环90次,每次循环中yrot-=1,然后绘制一次立方体;

     

           每次绘制之间间隔太小,即绘制频率太高,看起来立方体的边棱像破掉了,不知道是不是所谓的锯齿。

     

           如果放慢频率,就需要减少绘制立方体的次数,以缩短整个旋转周期。

     

           试了几次,个人觉得,绘制5次效果不错,每次旋转18度,绘制后中间Sleep一段时间,模式机器不同,Sleep 的时间不一样

           设置一个数值使旋转周期适中。

           我在模式EGL mode (win32 all): Direct Rendering下,Sleep(80);

           Bit模式下,应该要减小Sleep值。

     

    备注2:在Win32编程下,把窗口的句柄传给ES初始化,会是Bit模式

              MFC下,把this的句柄传给ES初始化,还是ES自己获得DC初始化,都是Direct模式,

             不知道怎么设置成Bit模式,Direct模式会独占屏幕,没法使用GDI

     

     

     

    立方体坐标:

    GLfixed pCubeVertex[rotMax][12]=

    {

             //enum rot{rotFrontR,rotFrontT,rotTop,rotBottom,rotRight,rotLeft,rotMax};

             {

                       glF(-5.0f),  glF(-3.0f), glF(5.0f),       //0  (rotFrontR)      左下,,,左右转的前面坐标

                       glF(5.0f),   glF(-3.0f), glF(5.0f),      //1                                右下

                       glF(5.0f),   glF(3.0f),  glF(5.0f),    //2                                右上

                       glF(-5.0f),  glF(3.0f),  glF(5.0f)      //3                                左上

             },

             {

                       glF(-5.0f),  glF(-3.0f), glF(3.0f),       //0  (rotFrontT)      左下,,,上下转的前面坐标

                       glF(5.0f),   glF(-3.0f), glF(3.0f),      //1                                右下

                       glF(5.0f),   glF(3.0f),  glF(3.0f),    //2                                右上

                       glF(-5.0f),  glF(3.0f),  glF(3.0f)      //3                                左上

             },

             {

                       glF(-5.0f),  glF(3.0f),  glF(-3.0f),   //8  (rotTop)  左上

                       glF(-5.0f),  glF(3.0f),  glF( 3.0f),    //9                      左下

                       glF( 5.0f),  glF(3.0f),  glF( 3.0f),    //10           右下

                       glF( 5.0f),  glF(3.0f),  glF(-3.0f)              //11           右上

             },

             {

                       glF(-5.0f),  glF(-3.0f), glF(-3.0f),    //12  (rotBottom)左下

                       glF( 5.0f),  glF(-3.0f), glF(-3.0f),          //13   右下

                       glF( 5.0f),  glF(-3.0f), glF(3.0f),      //14             右上

                       glF(-5.0f),  glF(-3.0f), glF(3.0f),           //15             左上

             },

             {

                       glF(5.0f),   glF(-3.0f), glF(-5.0f),     //16  (rotRight)

                       glF(5.0f),   glF( 3.0f), glF(-5.0f),     //17

                       glF(5.0f),   glF( 3.0f), glF( 5.0f),     //18

                       glF(5.0f),   glF(-3.0f), glF( 5.0f)                //19

             },

             {

                       glF(-5.0f),  glF(-3.0f), glF(-5.0f),      //20  (rotLeft)

                       glF(-5.0f),  glF(-3.0f), glF( 5.0f),      //21

                       glF(-5.0f),  glF( 3.0f), glF( 5.0f),      //22

                       glF(-5.0f),  glF( 3.0f), glF(-5.0f)                 //23

             }

    };

    绘制立方体时三角形顶点选择顺序

    glDrawElements函数使用

    GLushort pCubeIndex_front[]={

             0,1,2,

             0,2,3,  //

    };

     

    glDrawElements(GL_TRIANGLES,2*3,GL_UNSIGNED_SHORT,pCubeIndex_front);

    GL_TRIANGLES说明要绘制的图形是三角形, 2*3代表6个顶点,两个三角形

     

    纹理对应坐标:

    GLfixed pTexCoord[rotMax][8]=

    {

             {//front

                       glF(0.0f), glF(0.0f), //左下

                       glF(1.0f), glF(0.0f), //右下

                       glF(1.0f), glF(1.0f), //右上

                       glF(0.0f), glF(1.0f)  //左上

             },

             {//front

                       glF(0.0f), glF(0.0f), //左下

                       glF(1.0f), glF(0.0f), //右下

                       glF(1.0f), glF(1.0f), //右上

                       glF(0.0f), glF(1.0f)  //左上

             },

     

             {

                       // Top Face

                       glF(0.0f), glF(1.0f),

                       glF(0.0f), glF(0.0f),

                       glF(1.0f), glF(0.0f),

                       glF(1.0f), glF(1.0f)

             },

             {

                       // Bottom Face

                       glF(0.0f), glF(0.0f),

                       glF(1.0f), glF(0.0f),

                       glF(1.0f), glF(1.0f),

                       glF(0.0f), glF(1.0f)

             },

             {

                       // Right face

                       glF(1.0f), glF(0.0f),

                       glF(1.0f), glF(1.0f),

                       glF(0.0f), glF(1.0f),

                       glF(0.0f), glF(0.0f)

             },

             {

                       // Left Face

                       glF(0.0f), glF(0.0f),

                       glF(1.0f), glF(0.0f),

                       glF(1.0f), glF(1.0f),

                       glF(0.0f), glF(1.0f)

             }

    };

  • 相关阅读:
    嵌套矩形
    Multiplication Puzzle
    animate.css在vue项目中的使用
    服务器相关知识
    webpack-cli安装和插件的安装
    新买阿里云linux服务器如何设置账号密码xshell远程登陆
    主流请求库axios库的使用
    什么是回调函数
    js------match() 方法
    cookie
  • 原文地址:https://www.cnblogs.com/ezhong/p/2171470.html
Copyright © 2011-2022 走看看