移植2D物理引擎到LVGL

背景

在LVGL交流群,有网友提出想要移植物理引擎到LVGL,遂有了本文。阅读本文需要对IDF和LVGL有所了解
在这里插入图片描述

过程

2D物理引擎有很多,经过一番调研选择了Chipmunk2D

下载源码

此处省略一万字,Github访问可能会有些慢

添加文件

将源码中的src文件夹复制到,include/chipmunk/文件夹下,然后将chipmunk文件夹复制idf工程
在这里插入图片描述

完善lv_mem

lv_mem.h,lv_mem.c 文件里添加以下代码:

// lv_mem.h
void *lv_cp_malloc(size_t num,size_t size){
// lv_mem.c
void *lv_cp_malloc(size_t num,size_t size){
    size_t total_size = num * size;
    void* ptr = lv_malloc(total_size);  // 分配内存

    if (ptr != NULL) {
        lv_memset(ptr, 0, total_size);  // 初始化为零
    }

    return ptr;
}

配置Chipmunk2D

修改chipmunk.h,修改完成以后,物理引擎将共用LVGL的内存,总共8KB

// 添加头文件
#include "lvgl.h"
// 修改如下代码
#ifndef CP_BUFFER_BYTES
	#define CP_BUFFER_BYTES (8*1024) //默认32k,此处改为8k
#endif

#ifndef cpcalloc
	/// Chipmunk calloc() alias.
	// #define cpcalloc calloc
#define cpcalloc lv_cp_malloc
#endif

#ifndef cprealloc
	/// Chipmunk realloc() alias.
	// #define cprealloc realloc
	#define cprealloc lv_realloc
#endif

#ifndef cpfree
	/// Chipmunk free() alias.
	// #define cpfree free
	#define cpfree lv_free
#endif

编写Demo

新建 chipmunk_demo文件夹如下:
在这里插入图片描述
并在component.mk文件中添加配置路径:

COMPONENT_SRCDIRS := . \
                  chipmunk \
                  chipmunk_demo

编写代码:
1.创建一个世界
2. 给这个世界添加重力
3. 创建四面墙围成框
4. 小框里面创建一个小球
5. 给墙和小球分别设置摩擦系数和弹性系数
6. 给小球随机设置一个初始速度
7. 启动定时器,定时调用 cpSpaceStep(space, 1.0/30.0);来推动时间前进
8. 定时读取并跟新小球的位置

根据物理学原理:小球按照抛物线运动,碰撞到四周时会反弹

物理引擎模拟重力

各个文件代码如下

// chipmunk_demo.h
#ifndef CHIP_MUNK_ESP_DEMO_H
#define CHIP_MUNK_ESP_DEMO_H
#include "lvgl.h"
#include "esp_log.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "chipmunk/chipmunk.h"
#include "chipmunk/chipmunk_structs.h"


void start_chipmunk_esp_example();


#endif
//chipmunk_demo.c
#include "chipmunk_demo.h"

#include "lvgl.h"
#define WIDTH 480
#define HEIGHT 480
#define BALL_RADIUS 20
cpSpace *space;
cpBody *staticBody;
cpBody * ballBody;
lv_obj_t *ballObj;
const static double width = 480.0;
const static double height = 480.0;
void on_timer(lv_timer_t *t);


void start_chipmunk_esp_example(){

    lv_obj_t * bg = lv_obj_create(lv_scr_act());
    lv_obj_set_size(bg,width,height);
    lv_obj_center(bg);
    lv_obj_set_style_pad_all(bg,0,LV_PART_MAIN);
    lv_obj_set_style_bg_color(bg,lv_color_hex(0x000000),LV_PART_MAIN);
    ballObj = lv_obj_create(bg);

    lv_obj_remove_style_all(ballObj);
    // 生成一个随机颜色
    lv_color_t random_color = lv_color_make(rand() % 256, rand() % 256, rand() % 256);
    // 将随机颜色应用到对象上
    lv_obj_set_style_bg_color(ballObj, random_color, LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(ballObj,LV_OPA_100,LV_PART_MAIN);
    lv_obj_set_style_radius(ballObj,LV_RADIUS_CIRCLE,LV_PART_MAIN);
    lv_obj_set_size( ballObj,BALL_RADIUS*2,BALL_RADIUS*2);

    lv_obj_set_pos(ballObj,0,0);


    // 创建物理空间
    space = cpSpaceNew();
    cpSpaceSetGravity(space, cpv(0, 100));

    // 创建静态物体,即边界
    staticBody = cpSpaceGetStaticBody(space);
    cpShape *shape = cpSegmentShapeNew(staticBody, cpv(0,0), cpv(0, HEIGHT), 0.0f);
    cpShapeSetFriction(shape, 1.0);
    cpShapeSetElasticity(shape, 1.0);
    cpSpaceAddShape(space, shape);
    shape = cpSegmentShapeNew(staticBody, cpv(0, HEIGHT), cpv(WIDTH, HEIGHT), 0.0f);
    cpShapeSetFriction(shape, 1.0);
    cpShapeSetElasticity(shape, 1.0);
    cpSpaceAddShape(space, shape);
    shape = cpSegmentShapeNew(staticBody, cpv(WIDTH, HEIGHT), cpv(WIDTH, 0), 0.0f);
    // cpShapeSetFriction(shape, 1.0);
    cpShapeSetElasticity(shape, 1.0);
    cpSpaceAddShape(space, shape);
    shape = cpSegmentShapeNew(staticBody, cpv(WIDTH, 0), cpv(0, 0), 0.0f);
    cpShapeSetFriction(shape, 1.0);
    cpShapeSetElasticity(shape, 1.0);
    cpSpaceAddShape(space, shape);

    // // 创建1个小球
    cpFloat radius = 20.0;
    cpFloat x = cpflerp(radius * 2, WIDTH - radius * 2, (cpFloat)rand() / (cpFloat)RAND_MAX);
    cpFloat y = cpflerp(radius * 2, HEIGHT - radius * 2, (cpFloat)rand() / (cpFloat)RAND_MAX);

    ballBody = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForCircle(1.0f, 0.0f, radius, cpvzero)));
    cpBodySetPosition(ballBody, cpv(x, y));
    cpShape *ball_shape = cpSpaceAddShape(space, cpCircleShapeNew(ballBody, radius, cpvzero));
    cpShapeSetFriction(ball_shape, 0.7);
    cpShapeSetElasticity(ball_shape, 0.8);
    cpVect velocity = cpv((cpFloat)rand() / (cpFloat)RAND_MAX * 200 - 100, (cpFloat)rand() / (cpFloat)RAND_MAX * 200 - 100);
    cpBodySetVelocity(ballBody, velocity);



    lv_timer_t *timer = lv_timer_create(on_timer,30,NULL);
    lv_timer_set_repeat_count(timer,-1);

}
void on_timer(lv_timer_t *t){
    cpSpaceStep(space, 1.0/30.0);

    printf("Ball Position: (%.2f, %.2f)\n", cpBodyGetPosition(ballBody).x, cpBodyGetPosition(ballBody).y);
    lv_obj_set_pos(ballObj, cpBodyGetPosition(ballBody).x-20, cpBodyGetPosition(ballBody).y-20);
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/670844.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

达梦8 内存泄漏泄漏原因分析之一

在实际使用过程中经常发现DMSERVER进程在OS中的内存占用使用远远超过实际情况。原因有很多&#xff0c;下面列出其中一种&#xff1a; 测试库版本 SQL> select id_code;LINEID ID_CODE ---------- ----------------------------------- 1 --03134283938-2022…

DPDK基础组件一(mbuf、ring、pktmbuf_pool)

一、rte_mbuf 此部分转自:https://zhuanlan.zhihu.com/p/616314276 1.mbuf结构 mbuf是报文中的描素的结构体,是整个转发过程中最核心的数据结构之一。主要针对于mbuf的常用API与基本原理做一个简单的介绍。 mbuf:报文内存存储结构,存储在mempool中mempool:使用环形缓冲…

如何选择D类音频放大器(数字功率放大器)

1 简介 多年来&#xff0c;音频内容一直在不断发展。从当地唱片店购买 12 英寸 LP 黑胶唱片的时代已经成为过去&#xff0c;现在我们通过流式传输几乎可即时播放云端的任何内容。虽然一些音频爱好者会为了获得新奇体验而重拾黑胶唱片&#xff0c;但今天绝大多数的音频都是以数…

基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细

基于Nginx和Consul构建自动发现的Docker服务架构 文章目录 基于Nginx和Consul构建自动发现的Docker服务架构资源列表基础环境一、安装Docker1.1、Consul节点安装1.2、registrator节点安装 二、案例前知识点2.1、什么是Consul 三、基于Nginx和Consul构建自动发现的Docker服务架构…

[NOIP2015 提高组] 子串

题目背景 NOIP2015 Day2T2 题目描述 有两个仅包含小写英文字母的字符串 A A A 和 B B B。 现在要从字符串 A A A 中取出 k k k 个互不重叠的非空子串&#xff0c;然后把这 k k k 个子串按照其在字符串 A A A 中出现的顺序依次连接起来得到一个新的字符串。请问有多少…

从集合论到位运算

前言 本文将扫清位运算的迷雾&#xff0c;在集合论与位运算之间建立一座桥梁。 在高中&#xff0c;我们学了集合论&#xff08;set theory&#xff09;的相关知识。例如&#xff0c;包含若干整数的集合 S{0,2,3}。在编程中&#xff0c;通常用哈希表&#xff08;hash table&…

计算机网络学习2

文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…

【计算机毕业设计】331基于微信小程序的家庭财务管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

开源VS闭源:大模型发展路径之争,你站哪一派?

文章目录 引言一、数据隐私1.1开源大模型的数据隐私1.2 闭源大模型的数据隐私1.3 综合考量 二、商业应用2.1 开源大模型的商业应用2.2 闭源大模型的商业应用2.3 商业应用的综合考量 三、社区参与3.1 开源大模型的社区参与3.2 闭源大模型的社区参与3.3 综合考量 结论 引言 在人…

数据库与数据库管理系统 MySQL的安装 SQL语言学习:DDL、DML

day51 数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。 通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据&#xff0c;如数据库管理系统MySQL 数据…

html three.js 引入.stl模型示例

1.新建一个模块用于放置模型 <div id"chart_map" style"width:800px;height:500px"></div> 2. 引入代码根据需求更改 <!-- 在head或body标签内加入以下链接 --> <script src"https://cdn.jsdelivr.net/npm/three0.137/build/t…

c++的string一键介绍

前言&#xff1a; 这篇文章旨在帮助读者回忆如何使用string&#xff0c;并提醒注意事项。它不是一篇详细的功能介绍&#xff0c;而是一篇润色文章。 先展示重载函数&#xff0c;如果该函数一笔不可带过&#xff0c;就先展示英文原档&#xff08;附带翻译&#xff09;&#xf…

基于语音信号MFCC特征提取和GRNN神经网络的人员身份检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MFCC特征提取 4.2 GRNN神经网络概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ...............................................…

Django序列化器中is_valid和validate

今天上班的时候分配了一个任务&#xff0c;是修复前端的一个提示优化&#xff0c;如下图所示&#xff1a; 按照以往的经验我以为可以直接在validate上进行校验&#xff0c;如何抛出一个异常即可 &#xff0c;例如&#xff1a; class CcmSerializer(serializers.ModelSerialize…

HALCON-从入门到入门-软件界面介绍

1.废话 从halcon12到halcon23&#xff0c;开发的IDE界面大差不差&#xff0c;简单说下界面上不同功能按键的分布&#xff0c;以及一些快捷键啥的&#xff0c;要是还有我没有总结到的&#xff0c;又比较好用的&#xff0c;欢迎大家补充一下。 1.菜单栏 从上看到下&#xff0c;…

大型医疗器械企业四套系统数据集成技术干货分享

在大型医疗企业中&#xff0c;数据的互联互通是提升运营效率和数据利用率的关键。本次分享将概述如何通过轻易云集成平台将金蝶ERP、ZOHO CRM、泛微OA和汇联易报销系统进行高效联动&#xff0c;展示在实施过程中积累的技术干货。 某大型医疗企业&#xff0c;专注于麻醉和呼吸医…

系统架构设计师 - 操作系统(1)

操作系统 操作系统&#xff08;5-6分&#xff09;操作系统概述进程管理进程和线程的基本概念进程的状态 ★前趋图 ★★★★信号量与 PV 操作 ★★★★死锁及银行家算法 ★ 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享系统架构设计师 - 操作系统(1)知识&#xff0c…

B站如何屏蔽短视频:成都鼎茂宏升文化传媒公司

B站如何屏蔽短视频&#xff1a;优化你的观看体验 在当今数字化时代&#xff0c;B站&#xff08;哔哩哔哩&#xff09;作为国内领先的弹幕视频网站&#xff0c;以其丰富的视频资源和独特的弹幕文化吸引了大量用户。然而&#xff0c;随着短视频的兴起&#xff0c;B站也引入了短视…

智能学工系统实现学生管理

人才培养是高校的榜首要务&#xff0c;高校在抓好学生教育作业的一起&#xff0c;更多的是要加强对学生的办理作业。作为在校大学生健康成长的指导者和引路人&#xff0c;面临很多的学生办理作业内容杂乱&#xff0c;事无巨细&#xff0c;但在传统的办理方式下&#xff0c;尽管…

在 LLM 架构中应用多专家模型

本文转载自&#xff1a;在 LLM 架构中应用多专家模型 2024年 3月 14日 By Kyle Kranen and Vinh Nguyen https://developer.nvidia.cn/zh-cn/blog/applying-mixture-of-experts-in-llm-architectures/ 文章目录 一、概述二、LLM 架构领域的专家齐聚一堂1、模型容量2、MoE 在降低…