一、效果展示
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="Bw0KJKCL-1726499356483" src="https://player.bilibili.com/player.html?aid=113147843255763"></iframe>Android使用LiquidFun物理引擎实现果冻碰撞效果
二、LiquidFun物理引擎简介
LiquidFun是一个由Google开发并开源的2D物理模拟库,它基于Box2D物理引擎,并扩展了流体模拟的功能。
-
流体动力学模拟:LiquidFun提供了强大的流体动力学系统,可以模拟流体的行为,包括液体的流动、受力、碰撞等。这使得开发者能够创建逼真的水流、波浪、液体效果,为游戏和图形应用增加真实感。
-
刚体动态系统:除了流体模拟,LiquidFun还支持刚体的模拟,包括物体的运动、碰撞、旋转等。这使得开发者可以在同一个场景中同时模拟流体和刚体的行为,创建复杂的物理交互场景。
三、Android例程代码
添加软体 箱子和球体
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
this.addBox(gl, 1, 20, -20, 10, 0, BodyType.staticBody, 10, R.drawable.wall);
this.addBox(gl, 1, 20, 20, 10, 0, BodyType.staticBody, 10, R.drawable.wall);
this.addBox(gl, 20, 1, 0, 0, 0, BodyType.staticBody, 10, R.drawable.wall);
this.addBox(gl, 20, 1, 0, 30, 0, BodyType.staticBody, 10, R.drawable.wall);
// 添加软体
this.addSoftBody(gl, 2, 2, 8.5f, 5, 0.2f, R.drawable.nut3);
// this.addSoftBody(gl, 2, 2, 8.5f, 5, 0.2f, R.drawable.nut3);
// this.addSoftBody(gl, 2, 2, 8.5f, 5, 0.2f, R.drawable.maricha);
// 添加一个箱子
this.addBox(gl, 2, 2, 10, 15, 0, BodyType.dynamicBody, 1, R.drawable.wall);
// 添加一个球
this.addCircle(gl, 1, 11, 15, 0, BodyType.dynamicBody, 1, R.drawable.ball);
//gl.glEnable(GL10.GL_DEPTH_TEST);
// 背景颜色
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_BLEND);
}
private int makeTexture(GL10 gl10, int resId) {
Integer texId = this.mapResIdToTextureId.get(resId);
if (texId != null) {
return texId;
}
Bitmap bmp= BitmapFactory.decodeResource(this.view.getContext().getResources(), resId);
int[] textureIds=new int[1];
gl10.glGenTextures(1,textureIds, 0);
gl10.glActiveTexture(GL10.GL_TEXTURE0);
gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureIds[0]);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
gl10.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
gl10.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST);
this.mapResIdToTextureId.put(resId, textureIds[0]);
return textureIds[0];
}
四、完整例程代码下载:
LiquidFunTest.zip: https://url83.ctfile.com/f/45573183-1357424168-253b9e?p=7526 (访问密码: 7526)