Android OpenGL ES 茶壶爆炸实现

Android OpenGL ES Teapot Explosion Implementation

您好,我已经在 OpenlGL ES 2.0 中成功渲染了犹他茶壶。目前我正在尝试实现触摸事件,这样每当我触摸茶壶时它就会爆炸。

我的问题是我应该在渲染器 Class 或 GLSurfaceView 中的什么地方实现触摸事件?以及如何让茶壶爆炸。先感谢您。我是新来的 Android 非常感谢任何建议

关于触摸事件:

您需要出示您当前拥有的 system/architecture。通常你会有一个单独的 class 来控制场景。在您的情况下,您可能只有一个对象,其中包含茶壶及其绘制、移动或爆炸所需的所有值……所以这个 class 应该由表面视图或其父级初始化和拥有。在这两种情况下,表面视图都可以访问场景。现在,如果我假设渲染器负责绘制,那么表面视图是渲染器的所有者,并且会调用类似于 this.myRenderer.drawScene(this.myScene) 的东西,或者如果渲染器对绘制初始化有控制权,那么表面视图必须转发访问到现场所以this.myRenderer.setScene(this.myScene)。所以最后两个 classes 都可以访问场景并使用它访问茶壶对象。

现在要处理触摸事件,您需要检查可以拦截触摸事件的最近位置。如果表面视图可以拦截这些调用,那么就在那里实现它。如果不是,我确定表面视图的所有者可以,在这种情况下所有者会调用 this.mySurfaceView.handleTouchEvent(touch).

现在表面视图可以有选择地进行一些检查以查看锅是否被击中并开始爆炸程序。这可能就像只调用茶壶上的方法一样简单 this.myScene.teapotObject.explode().

关于爆炸本身:

有很多方法可以分解物体,而且通常 none 很容易。最有可能的最低限度是拥有一个系统,您的顶点缓冲区将被分成更小的块,然后每个块在爆炸时动画地错位。

即使创建动画也可能是一个艰难的过程。一种方法是创建一个插值,其中您将拥有动画开始时间 startTimeStamp、动画开始时间 duration、对象开始位置 startPosition 和对象结束位置 endPosition。然后通过 currentPosition = startPosition + (endPosition -startPosition)*(startTimeStamp-currentTimeStamp)/duration 检索当前位置。另一种方法是实现对象在每一帧上移动的物理。在这种情况下,您定义对象 speed,然后在每一帧上调用 teapot.chunk.move(1.0/60.0),然后调用 this.position += this.speed*dt。然后您可以添加重力来操纵速度或碰撞...