Opengl_es模型矩阵位置:glFrustumx与glTranslatef参数的相互影响--立方体旋转特效
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轴深度等于glFrustumx的zNear参数值
假如设置glFrustumx(glF(-5.0f), glF(5.0f), glF(-3.0f), glF(3.0f), glF(zz),glF(1000.0f));
(屏幕长宽比5:3)
立方体模型的前面和右侧面坐标
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值不变,会看不到立方体的角,因为立方体旋转时有部分已经不在near到far之间
要一直看到完整的立方体,应在旋转的时候移动模型矩阵,加大sz的绝对值,也就是往屏幕深处拉模型矩阵(立方体)。
最简单的处理是 如果立方体向左转的话,zz加上立方体中心点到右棱边的距离a:a*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)
}
};
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ezhong的博客签名-------------------------------------
以上内容来自ezhong的博客园,作者:ezhong
ezhong的博客园: http://www.cnblogs.com/ezhong
感谢您的阅读。感谢您的分享。