Gallery 3D 代码分析之 GLSurfaceView

Gallery 3D 代码分析之 GLSurfaceView
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

相关文档
最新文档