您的位置:首页 > 运维架构

OpenGL学习(三):坐标变换

2016-10-16 15:17 246 查看
矩阵操作,单位矩阵

在进行平移,旋转,缩放变换时,所有的变换都是针对当前的矩阵(与当前矩阵相乘),如果需要将当前矩阵回复最初的无变换的矩阵,可以使用单位矩阵(无平移,缩放,旋转)。

public abstract void glLoadIdentity()。


在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用

public abstract void glPushMatrix()




public abstract void glPopMatrix()。


在进行坐标变换的一个好习惯是在变换前使用glPushMatrix保存当前矩阵,完成坐标变换操作后,再调用glPopMatrix恢复原先的矩阵设置。

步骤一、在OpenGLGLRenderer的OnDrawFrame方法中

添加
//3D坐标转换
ThrereDLocationConvert(gl);

/**
* 3D坐标转换
*
* @param gl
*/
private void ThrereDLocationConvert(GL10 gl) {
//清除屏幕和深度缓冲。
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//重置投影矩阵
gl.glLoadIdentity();
/*******************第一个矩形 A **********************/
/**
* 因为OpenGL ES从当前位置开始渲染,缺省坐标为(0,0,0),和View port 的坐标一样,
* 相当于把画面放在眼前,对应这种情况OpenGL不会渲染离view Port很近的画面,
* 因此我们需要将画面向后退一点距离:
*
* 此操作没有的话,Square不会显示
*/
gl.glTranslatef(0, 0, -10);
// 正方形 A 保存当前矩阵
gl.glPushMatrix();
//逆时针旋转正方形
Log.d("angle", "A--angle==>" + angle);
gl.glRotatef(angle, 0, 0, 1);
//画Square
square.draw(gl);
//******恢复过去的矩阵。*****
gl.glPopMatrix();

/*******************第二个矩形  B**********************/
// 正方形 B 保存当前矩阵
gl.glPushMatrix();
//正方形A之前它旋转,使其旋转。
Log.d("angle", "B--angle==>" + angle);
gl.glRotatef(-angle, 0, 0, 1);
//移动正方形B
gl.glTranslatef(2, 0, 0);
//缩小为正方形A的50%
gl.glScalef(0.5f, 0.5f, 0.5f);
//画Square
square.draw(gl);

/**********************第三个矩形 C********************/
// 正方形 C 保存当前矩阵
gl.glPushMatrix();
// 正方形B之前它旋转,使其旋转。
Log.d("angle", "C--angle==>" + angle);
gl.glRotatef(-angle, 0, 0, 1);
//移动正方形C
gl.glTranslatef(2, 0, 0);
//缩小为正方形B的50%
gl.glScalef(0.5f, 0.5f, 0.5f);
//围绕它旋转的中心。
gl.glRotatef(angle * 10, 0, 0, 1);
//画Square
square.draw(gl);

/************************************************/
/**
* 在这里要注意,恢复矩阵位置。
*/
//在正方形C之前恢复矩阵
gl.glPopMatrix();
//在正方形B之前恢复矩阵
gl.glPopMatrix();

angle++;
}


步骤二、log日志



步骤三、效果图



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: