Gallery 3D 代码分析之 GLSurfaceView
SDK 中的android.opengl.GLSurfaceView类提供如下功能:
?在OpenGL ES 和View 系统之间建立联系;
?使得OpenGL ES 可以工作在Activity 生命周期中;
?可选择合适的frame buffer 像素格式;
?创建并管理一个单独的渲染线程,可以实现平滑的动画;
?提供debugging 工具和API。
一个简单的GLSurfaceView 应用
Java代码
1.package com.example.android.apis.graphics;
2.
3.import javax.microedition.khronos.egl.EGLConfig;
4.import javax.microedition.khronos.opengles.GL10;
5.
6.import android.app.Activity;
7.import android.opengl.GLSurfaceView;
8.import android.os.Bundle;
9.
10.public class ClearActivity extends Activity {
11.@Override
12.protected void onCreate(Bundle savedInstanceState) {
13.super.onCreate(savedInstanceState);
14. mGLView = new GLSurfaceView(this);
15. mGLView.setRenderer(new ClearRenderer());
16. setContentView(mGLView);
17. }
18.
19.@Override
20.protected void onPause() {
21.super.onPause();
22. mGLView.onPause();
23. }
24.
25.@Override
26.protected void onResume() {
27.super.onResume();
28. mGLView.onResume();
29. }
30.
31.private GLSurfaceView mGLView;
32.}
33.
34.class ClearRenderer implements GLSurfaceView.Renderer {
35.public void onSurfaceCreated(GL10 gl, EGLConfig config) {
36.// Do nothing special.
37. }
38.
39.public void onSurfaceChanged(GL10 gl, int w, int h) {
40. gl.glViewport(0, 0, w, h);
41. }
42.
43.public void onDrawFrame(GL10 gl) {
44. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
45. }
46.}
这个程序功能很简单,每帧绘制时将屏幕设置成黑色。但它是一个完整的工作在Activity 生命周期中的OpenGL 程序。当activity 暂停时,它暂停渲染;当activity 继续时,它继续渲染。可以将这个程序用作非交互式的demo 程序。可以在ClearRenderer.onDrawFrame() 接口中增加OpenGL 调用做很多的绘制。
GLSurfaceView.Render 接口有三个方法:
* onSurfaceCreated():该方法在渲染开始前调用,OpenGL ES 的绘制上下文被重建时也会被调用。当activity 暂停时绘制上下文会丢失,当activity 继续时,绘制上下文会被重建。另外,创建长期存在的OpenGL 资源(如texture)往往也在这里进行。
* onSurfaceChanged():当surface 的尺寸发生改变时该方法被调用。往往在这里设置viewport。若你的camera 是固定的,也可以在这里设置camera。
* onDrawFrame():每帧都通过该方法进行绘制。绘制时通常先调用glClear函数来清空framebuffer,然后在调用OpenGL ES 的起它的接口进行绘制。
输入如何处理
若是开发一个交互型的应用(如游戏),通常需要子类化GLSurfaceView,由此可以获取输入事件。下面有个例子:
Java代码
1.package com.google.android.ClearTest;
2.
3.import javax.microedition.khronos.egl.EGLConfig;
4.import javax.microedition.khronos.opengles.GL10;
5.
6.import android.app.Activity;
7.import android.content.Context;
8.import android.opengl.GLSurfaceView;
9.import android.os.Bundle;
10.import android.view.MotionEvent;
11.
12.public class ClearActivity extends Activity {
13.@Override
14.protected void onCreate(Bundle savedInstanceState) {
15.super.onCreate(savedInstanceState);
16. mGLView = new ClearGLSurfaceView(this);
17. setContentView(mGLView);
18. }
19.
20.@Override
21.protected void onPause() {
22.super.onPause();
23. mGLView.onPause();
24. }
25.
26.@Override
27.protected void onResume() {
28.super.onResume();
29. mGLView.onResume();
30. }
31.
32.private GLSurfaceView mGLView;
33.}
34.
35.class ClearGLSurfaceView extends GLSurfaceView {
36.public ClearGLSurfaceView(Context context) {
37.super(context);
38. mRenderer = new ClearRenderer();
39. setRenderer(mRenderer);
40. }
41.
42.public boolean onTouchEvent(final MotionEvent event) {
43. queueEvent(new Runnable(){
44.public void run() {
45. mRenderer.setColor(event.getX() / getWidth(),
46. event.getY() / getHeight(), 1.0f);
47. }});
48.return true;
49. }
50.
51. ClearRenderer mRenderer;
52.}
53.
54.class ClearRenderer implements GLSurfaceView.Renderer {
55.public void onSurfaceCreated(GL10 gl, EGLConfig config) {
56.// Do nothing special.
57. }
58.
59.public void onSurfaceChanged(GL10 gl, int w, int h) {
60. gl.glViewport(0, 0, w, h);
61. }
62.
63.public void onDrawFrame(GL10 gl) {
64. gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
65. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
66. }
67.
68.public void setColor(float r, float g, float b) {
69. mRed = r;
70. mGreen = g;
71. mBlue = b;
72. }
73.
74.private float mRed;
75.private float mGreen;
76.private float mBlue;
77.}
其他的GLSurfaceView 例子
在Android SDK 的API Demo例子程序中还有很多例子:
?GLSurfaceView
?Kube
?Translucent GLSurfaceView:透明背景
?Textured Triangle:纹理贴图
?Sprite Text:在texture 上写文本并显示在3D 场景中
?Touch Rotate:旋转3D 对象
选择一个Surface
GLSurfaceView 提供了接口可选择surface 的类型。默认情况下,GLSurfaceView 会使用一个16 位RGB frame buffer,带16 位深度。你也可以根据自己的需要进行选择,比如在Translucent GLSurfaceView例子里,需要一个Alpha 通道来实现透明。GLSurfaceView 提供了
setEGLSurfaceChooser()方法来选择surface。
选择一个RGB (565)的16位framebuffer,接口如下:
Java代码
1.setEGLConfigChooser(boolean needDepth)
若要定制red, green, blue, alpha 和depth,则用如下接口:
Java代码
1.setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,i
nt depthSize, int stencilSize)
使用自己实现的EGLConfigChooser,用如下的接口:
Java代码
1.setEGLConfigChooser(EGLConfigChooser configChooser)
持续型渲染模式& 通知型渲染模式
大多数3D 应用,如游戏、模拟等都是持续型渲染的动画,还有些3D 应用是反应式的(reactive),它们往往先被动等待,当用户有了动作再做出反应。对于这种应用,持续渲染屏幕是浪费时间。若开发反应式的应用,可以调用下面的方法
Java代码
1.GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);
停止持续渲染。当调用
Java代码
1.GLSurfaceView.requestRender()
时,程序再渲染屏幕。
调试
GLSurfaceView.setDebugFlags() 方法可以激活log或者错误检测,它们可以帮助调试OpenGL ES 调用。具体使用时,在GLSurfaceView 的构造函数中,调用setRender() 之前调用
GLSurfaceView.setDebugFlags()就可以了。下面是个例子:
Java代码
1.public ClearGLSurfaceView(Context context) {
2.super(context);
3.// Turn on error-checking and logging
4. setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
5. mRenderer = new ClearRenderer();
6. setRenderer(mRenderer);
7.}
公差分析软件CETOL-6-sigma实例
使用公差分析软件CETOL 6 σ进行公差分析的实例 ----汽车锁具公差分析案例 针对汽车锁具Pro/E模型,采用Pro/E完全集成环境下的公差分析软件CETOL 6 σ,来做公差模型的创建,基于CETOL提供的系统矩(SOTA法)算法,做统计和极限二种情况下的公差分析。 一.锁具质量关心焦点 作为汽车座椅锁具,其质量的好坏,关系到汽车驾乘人员乘坐的舒适性和安全性。锁具在开锁时,希望能够充分打开,不要与其他零部件之间产生干涉,即顺利打开。锁具在闭锁时,能够经受得住外力的冲击,不至于产生突然脱开现象。在锁具的任何状态,都要求锁具动作部件能够与电器设备很好地连接,在电控装配的驱动下,锁具能够准确地运转到指定的位置。根据设计功能要求,把项目细分到具体的状态上,在运动部件的具体指定位置,做功能要求的详细设定。 1)一个关键质量要求就是爪轮在打开时要远离侧板的开口槽,这是为了确保爪轮不会与锺棒产生干涉。如图1所示。 test
2)锁轮上的孔,在完成机械装配后,需要从这个孔里穿电缆线,来接通电源。根据座椅的设计要求,为了保证电缆线能与
机械设备能可靠地连接,电缆线过孔必须在位于基准孔名义值的正负2个mm之间。如果尺寸超过了上极限,锁具就会出现卡死现象,如果超过了下极限,电缆线就不能很好地与电器设置连接,导致零件废弃和成本增加。 图 2 闭锁时的测量尺寸 另外一个关键尺寸就接触力位置,这个接触力与作用方向一致,是在爪轮和中轮之间,接触力矢量的位置决定了是否有足
够的闭锁运动来保持锁具在冲压载荷的情况仍能正常闭锁,加工和装配偏差都有可能这些关键质量要求产生失效,过紧的公差会增加成本也有可能导致产品无法加工。为了生产高质量低成本的产品,有必要在设计阶段就能理解所有这些问题。 二. 创建公差分析目标 公差分析的前提首先要确定装配性能尺寸,对于锁具装配体,需要确定具体的装配状态。实施步骤如下: 1) 启动CETOL软件的分析器。 a.启动Pro/E。 b.启动CETOL,路径:开始/程序/sigmetrix/CETOL 6 sigma v8.2 for Pro ENGINEER/CETOL v8.2 Modeler。 c.打开锁具装配体。 d. 配置CETOL与Pro/E同步 2) 打开CETOL选项菜单。 a.从工具-选项栏目选择,在偏差标签栏设置 ,如图3 b. 在图表和高亮显示设置栏,设置如下:如图4