Android基于LiquidFun引擎实现软体碰撞效果

article/2025/6/28 12:26:44

一、实现效果

Android使用LiquidFun物理引擎实现果冻碰撞效果

二、Android代码

    // 加载liquidfun动态库static {System.loadLibrary("liquidfun");System.loadLibrary("liquidfun_jni");}class ParticleData {long id;ParticleSystem particleSystem;float particleRadius;int textureId;ArrayList<ArrayList<Integer>> row;public ParticleData(long id, ParticleSystem ps, float particleRadius, ArrayList<ArrayList<Integer>> row, int textureId) {this.id = id;this.particleSystem = ps;this.textureId = textureId;this.particleRadius = particleRadius;this.row = row;}public long getId() {return this.id;}public ParticleSystem getParticleSystem() {return this.particleSystem;}public int getTextureId() { return this.textureId;}public float getParticleRadius() { return this.particleRadius;}public ArrayList<ArrayList<Integer>> getRow() { return this.row;}}class BodyData {long id;Body body;FloatBuffer vertexBuffer;FloatBuffer uvBuffer;int vertexLen;int drawMode;int textureId;public BodyData(long id, Body body, float[] buffer, float[] uv, int drawMode, int textureId) {this.id = id;this.body = body;this.vertexBuffer = makeFloatBuffer(buffer);this.uvBuffer = makeFloatBuffer(uv);this.vertexLen = buffer.length / 2;this.drawMode = drawMode;this.textureId = textureId;}public long getId() {return this.id;}public Body getBody() {return this.body;}public FloatBuffer getVertexBuffer() {return this.vertexBuffer;}public FloatBuffer getUvBuffer() { return this.uvBuffer;}public int getDrawMode() { return this.drawMode;}public int getVertexLen() { return this.vertexLen;}public int getTextureId() { return this.textureId;}}public MainRenderer(MainGlView view) {this.view = view;world = new World(0, -10);//this.addBox(1, 1, 0, 10, 0, BodyType.dynamicBody, 0);}private void addBodyData(Body body, float[] buffer, float[] uv, int drawMode, int textureId) {long id = nextBodyDataId++;BodyData data = new BodyData(id, body, buffer, uv, drawMode, textureId);this.mapBodyData.put(id, data);}private void addParticleData(ParticleSystem ps, float particleRadius, ArrayList<ArrayList<Integer>> row, int textureId) {long id = nextBodyDataId++;ParticleData data = new ParticleData(id, ps, particleRadius, row, textureId);this.mapParticleData.put(id, data);}public void addCircle(GL10 gl,float r, float x, float y, float angle, BodyType type, float density, int resId) {// Box2d用BodyDef bodyDef = new BodyDef();bodyDef.setType(type);bodyDef.setPosition(x, y);bodyDef.setAngle(angle);Body body = world.createBody(bodyDef);CircleShape shape = new CircleShape();shape.setRadius(r);body.createFixture(shape, density);// OpenGL用float vertices[] = new float[32*2];float uv[] = new float[32*2];for(int i = 0; i < 32; ++i){float a = ((float)Math.PI * 2.0f * i)/32;vertices[i*2]   = r * (float)Math.sin(a);vertices[i*2+1] = r * (float)Math.cos(a);uv[i*2]   = ((float)Math.sin(a) + 1.0f)/2f;uv[i*2+1] = (-1 * (float)Math.cos(a) + 1.0f)/2f;}int textureId=makeTexture(gl, resId);this.addBodyData(body, vertices, uv, GL10.GL_TRIANGLE_FAN, textureId);}public void addBox(GL10 gl,float hx, float hy, float x, float y, float angle, BodyType type, float density, int resId) {// Box2d用BodyDef bodyDef = new BodyDef();bodyDef.setType(type);bodyDef.setPosition(x, y);Body body = world.createBody(bodyDef);PolygonShape shape = new PolygonShape();shape.setAsBox(hx, hy, 0, 0, angle);body.createFixture(shape, density);// OpenGL用float vertices[] = {- hx, + hy,- hx, - hy,+ hx, + hy,+ hx, - hy,};FloatBuffer buffer = this.makeFloatBuffer(vertices);float[] uv={0.0f,0.0f,//左上0.0f,1.0f,//左下1.0f,0.0f,//右上1.0f,1.0f,//右下};FloatBuffer uvBuffer = this.makeFloatBuffer(uv);int textureId=makeTexture(gl, resId);this.addBodyData(body, vertices, uv, GL10.GL_TRIANGLE_STRIP, textureId);}public void addSoftBody(GL10 gl,float hx, float hy, float cx, float cy, float particleRadius, int resId) {ParticleSystemDef psd = new ParticleSystemDef();psd.setRadius(particleRadius);ParticleSystem ps = world.createParticleSystem(psd);PolygonShape shape = new PolygonShape();shape.setAsBox(hx, hy, 0, 0, 0);ParticleGroupDef pgd = new ParticleGroupDef();pgd.setFlags(ParticleFlag.elasticParticle);pgd.setGroupFlags(ParticleGroupFlag.solidParticleGroup);pgd.setShape(shape);pgd.setPosition(cx, cy);ParticleGroup pg = ps.createParticleGroup(pgd);float py = 0;ArrayList<ArrayList<Integer>> row = new ArrayList<ArrayList<Integer>>();ArrayList<Integer> line = new ArrayList<Integer>();for (int i = pg.getBufferIndex(); i < pg.getParticleCount() - pg.getBufferIndex(); ++i) {float y = ps.getParticlePositionY(i);if (i==0) {py = y;}if ((float)Math.abs(py - y) > 0.01f) {row.add(line);line = new ArrayList<Integer>();}line.add(i);py = y;}row.add(line);int textureId=makeTexture(gl, resId);this.addParticleData(ps, particleRadius, row, textureId);}

三、完整源码下载:LiquidFunTest源码: https://url83.ctfile.com/d/45573183-68059777-a5f411?p=7526 (访问密码: 7526)
 


http://www.hkcw.cn/article/tuUPbIcRSi.shtml

相关文章

Baklib赋能企业AI知识管理实践

Baklib构建AI-ready知识体系 Baklib作为新一代知识中台的核心引擎&#xff0c;通过知识图谱构建与自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;将碎片化信息转化为结构化知识资产。平台依托智能语义分析能力&#xff0c;自动识别文档中的实体关系与上下文逻辑&am…

如何在 Windows 11 24H2 的任务栏时钟中显示秒数

我们都很熟悉任务栏时钟&#xff0c;或者说&#xff0c;是我们运行 Windows 的电脑屏幕右下角的数字时钟。它显示小时和分钟的时间&#xff0c;这基本上是每个人需要的&#xff0c;但我们有时也需要看到秒数。随着 Windows 11 的最新更新&#xff0c;它可以在任务栏时钟中直接显…

navicate菜单栏不见了怎么办

别慌&#xff01;&#xff01;&#xff01; 将鼠标放到navicate框的最左侧&#xff0c;看到出现两个竖线&#xff08;像这样||&#xff09;&#xff0c;点击拖动鼠标拉出来吧。

张家界溶洞垃圾堆7层楼高 污染触目惊心

近日,一段视频曝光了张家界市慈利县一处天然溶洞遭到人为排污的情况,引发广泛关注。视频中,溶洞内流淌着泛着绿色的污水,伴有黄绿色的淤泥沉积,黑色污染物自洞壁滑落凝固成厚厚的“黑痂”。拍摄者称,垃圾堆积高度达到七八层楼,令人触目惊心。据张家界市生态环境局透露,…

软件安全保障关键之漏洞扫描:原理、分类及意义全解析?

软件安全保障的关键在于漏洞扫描&#xff0c;这项工作通过特定技术和流程进行&#xff0c;旨在发现软件中可能存在的安全隐患&#xff0c;比如缓冲区溢出、跨站脚本攻击等&#xff0c;这些漏洞得以被识别和记录&#xff0c;对确保软件安全具有重要意义。 扫描原理 漏洞扫描依…

韩国大选开始投票 5人竞逐总统 李在明领跑民调

韩国第21届总统大选于当地时间6月3日6时正式开始,全国共设有14295个投票站。没有参加提前投票的选民凭身份证件前往指定投票站即可参与投票,投票将于当日20时结束。本次大选共有7位候选人登记,但其中两位宣布退出并支持国民力量党候选人金文洙。因此,选民将从以下5位候选人…

计算机网络 : 应用层自定义协议与序列化

计算机网络 &#xff1a; 应用层自定义协议与序列化 目录 计算机网络 &#xff1a; 应用层自定义协议与序列化引言1. 应用层协议1.1 再谈协议1.2 网络版计算器1.3 序列化与反序列化 2. 重新理解全双工3. socket和协议的封装4. 关于流失数据的处理5. Jsoncpp5.1 特性5.2 安装5.3…

比亚迪打响降价战为哪般 应对销量与利润双重压力

比亚迪打响降价战为哪般 应对销量与利润双重压力。5月22日,比亚迪宣布对旗下王朝网和海洋网共计22款车型降价,降幅在1.2万元至5.3万元之间,活动将持续到6月底。这是比亚迪自三月底以来的第三次降价,力度最大。作为中国新能源汽车销量冠军,比亚迪的大面积、大幅度降价预示着…

电子电器架构 --- 远程信息控制单元(TCU)

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…

榴莲大降价!它能从“奢侈果”变成“亲民果”吗

夏季是各类水果集中上市的季节,榴莲爱好者们最近有口福了,市场上榴莲价格出现了大幅下降,甚至“腰斩”的情况。造成榴莲价格下跌的原因都有哪些?榴莲会不会就此从“奢侈果”变成“亲民果”?走进位于浙江湖州的一家榴莲批发店,榴莲成堆地被摆放在货架上,老板肖女士正在开…

ULVAC A2K 20K 40K CU Bar type 主动灭弧器 Active Arc Killer

ULVAC A2K 20K 40K CU Bar type 主动灭弧器 Active Arc Killer

美国再提高进口钢铝关税有何目的 贸易保护主义抬头

美国再提高进口钢铝关税有何目的 贸易保护主义抬头。当地时间5月30日,美国总统特朗普在宾夕法尼亚州的一场集会上宣布,将把进口钢铁的关税从25%提高至50%,并表示该决定从6月4日起生效。白宫当天也在社交媒体上发布公告称,为进一步保护美国钢铁行业免受外国和不公平竞争的影…

PCIe 边缘卡的 PCB 设计和引脚排列

标准台式计算机和嵌入式计算机中最常见的附加卡是 PCIe 卡。PCIe 附加卡具有多种外形尺寸&#xff0c;并使用边缘插槽连接器&#xff0c;可沿主板垂直或直角安装。您还有不同类型的 PCIe 设备&#xff0c;例如插入 M.2 连接器的 SSD 或模块。 在本文中&#xff0c;我将介绍使用…

吴恩达机器学习笔记(1)—引言

目录 一、欢迎 二、机器学习是什么 三、监督学习 四、无监督学习 一、欢迎 机器学习是当前信息技术领域中最令人兴奋的方向之一。在这门课程中&#xff0c;你不仅会学习机器学习的前沿知识&#xff0c;还将亲手实现相关算法&#xff0c;从而深入理解其内部机理。 事实上&…

5月中国100个城市新房均价上涨 环比上涨0.30%

5月中国100个城市新房均价上涨 环比上涨0.30%!6月1日,中指研究院发布《中国房地产指数系统百城价格指数报告》。报告显示,5月全国100个城市新建住宅平均价格环比上涨0.30%,同比上涨2.56%。具体来看,33个城市环比上涨,54个城市环比下跌,13个城市持平。二手房价格和租金则…

婚礼现场喜婆婆上台表演才艺助兴 倒立旗袍秀惊呆众人

婚礼现场喜婆婆上台表演才艺助兴 倒立旗袍秀惊呆众人。婚礼上,儿媳正安安静静地享受美食,没想到婆婆却在舞台上大显身手,开始表演了起来。5月26号,浙江一对小夫妻的婚礼热闹得像过年,媳妇在台下大快朵颐,结果她妈居然跑到台上倒立表演,还特意穿了个旗袍,一边倒头翻转一…

专家:中方捍卫主权让西方政客破防 坚定立场震慑“台独”

专家:中方捍卫主权让西方政客破防 坚定立场震慑“台独”!近日,国防部新闻发言人张晓刚大校就台湾问题及解放军演练活动作出回应,重申台湾是中国不可分割的一部分,并强调中国军队的演练活动旨在捍卫国家主权与领土完整。这一表态既是对外部势力干涉台海局势的警告,也是对“…

牛弹琴:乌无人机攻击预示可怕未来 战争新纪元开启

牛弹琴:乌无人机攻击预示可怕未来 战争新纪元开启。乌克兰最近进行了一次大胆且成功的无人机集群攻击,这次行动的目标甚至远至俄罗斯西伯利亚,靠近俄罗斯和蒙古国边境。根据乌克兰总统泽连斯基的说法,这次袭击是经过一年多精心策划的,乌军出动了117架无人机,给俄军造成了…

佛山叠滘“郭富城”扒龙船帅到飞起 水上速度与激情

佛山叠滘“郭富城”扒龙船帅到飞起 水上速度与激情。当18岁的打工仔放下螺丝刀,拿起龙舟桨,在S弯河道上演“水上速度与激情”时,传统文化不再是老年人的专属。这个被网友称为叠滘“郭富城”的小伙,用汗水和笑声撕掉了传统运动的陈旧标签。在叠滘不足5米的窄巷水道里,25米长…

印度已成为全球第四大经济体了吗 崛起势头迅猛

印度已成为全球第四大经济体了吗 崛起势头迅猛。未来十年,全球经济格局可能发生变化,中印之间争夺全球经济老二的位置成为焦点。尽管许多人不愿相信,但印度的黄金时代或许已经到来。2022年,印度超越英国成为全球第五大经济体,近期其经济总量更是超过4万亿美元,赶超日本,…