- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
AndroidOpenGLES3D基础教程二
接着上一节,下面我想从简单的点绘制来讨论起,例子是一个螺旋的弹簧,由点绘制组成。(无论如何我还是希望学习的同学,从这些很基础的东西,了解透然后学后面的API的调用实现)。
AbstractRenderer该抽象类就是上一节说到的对Renderer的一层包装。由于上一节已经详细讲说了其中的每一个函数的含义,这里就不做多讲解,代码如下:
public abstract class AbstractRenderer implements Renderer {
// 绘制画面过程调用
@Override
public void onDrawFrame(GL10 gl) {
gl.glDisable(GL10.GL_DITHER); // 关闭抗抖动
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除缓存
gl.glMatrixMode(GL10.GL_MODELVIEW);// 设置矩阵:模式矩阵
gl.glLoadIdentity();// 设置为单位矩阵
GLU.gluLookAt(gl, 0, 0, -4f, 0, 0, 0, 0, 1f, 0);// 此处相当于设置观看地点,被观看的地点以及观看的角度
gl.glTranslatef(0, 0, -4f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);// 启用顶点坐标数组
draw(gl);// 绘制
}
// 当绘制面改变时(如 窗口大小改变)
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
float radio = (float) width / height;// 宽高比例
gl.glViewport(0, 0, width, height);// 设置可视窗口
gl.glMatrixMode(GL10.GL_PROJECTION);// 设置矩阵为投影矩阵
gl.glLoadIdentity();// 改变时一样要记得 设置为单位矩阵( 重点)
// gl.glFrustumf(-radio, radio, -1, 1, 0, 1);// 投影截头锥体
gl.glOrthof(-width / 2f, width / 2f, -height / 2f, height / 2f, -1000f, 1000f);
}
// 成功创建画面时
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 示意快速矫正透视图
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
// 使用颜色刷屏
gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
// 着色模式:平滑着色
gl.glShadeModel(GL10.GL_SMOOTH);
//打开颜色混淆
gl.glEnable(GL10.GL_BLEND);
// 启用深度检测
gl.glEnable(GL10.GL_DEPTH_TEST);
}
// 此方法用于绘制过程
protected abstract void draw(GL10 gl);
}
在这里注意几点不同:首先,在onSurfaceChanged函数中,我没有用到上一节的glFrustumf函数,在这里用了另外一个函数glOrthox,他们之间区别是什么,可以从参考下图:
由于本人水平有限,加上这个工具又各种问题,所以就画出了这个模型,简单解释一下,第一幅图就是glOrthox在坐标中的立方体就是我们能看到的空间,所有在立方体中的点都可以映射到屏幕上,他自动会适应屏幕大小,glFrumstumf就是上图的平截头体,而和第一幅图一样我们能看到的空间就是这个平截头体,这个头体中间的所用物体都会映射到屏幕上。
其次,我们要注意的地方就是,在onDrawFrame中GLU.gluLookAt(gl, 0, 0, -4, 0, 0, 0, 0, 1, 0);该函数的意思,如果大家注意到上面那个图的话就可以看到,是不是有一个观察点,那么观察点及其状况就是这里所设置的。这里后面的9个参数是三个三维坐标,第一个坐标表示眼睛的地点,第二个坐标表示眼睛观察的坐标点,第三个表示眼睛观察的角度。
大家可以调节这些参数来真正的体验一下它具体的实现。
p
文档评论(0)