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)

         }

};