Bullet的最小化功能封装

既然是"最小化", 那么就要明确最少需要哪些功能. 对于一般的物理应用来说, 只是简单地模拟碰撞, 柔体什么的都用不到. 在这样的前提下, bullet的工程可以精简到三个: libbulletcollision, libbulletdynamics, libbulletmath.

接下来, 需要明确一下基本的物理概念. 这个是跟用什么库(physx, havok, etc)是没有关系的. 在上面的前提下, 物理方面可以抽象成一个程序对象和三个物理对象:

  • 程序对象: 就是对物理引擎的包装, 一般只有三个行为: 创建, 销毁, 更新.
  • 物理对象:
    • 世界: 就是场景, 物体模拟发生的舞台. 基本功能有添加Actor(下面这俩东西), 设置重力, 射线拣取
    • 静态物件: 不可移动的碰撞物件, 如房子, 树. 这个通常是由多个基本几何对象(box, capsule, sphere, cylinder...)组成.
    • 动态刚体: 可以移动的或可被碰撞影响的物件, 如皮球, 人, 车等. 需要与图形表示(图形引擎中的模型)进行绑定的属性有位置, 朝向, 大小. 通常只需要从中获取变换矩阵并更新到图形引擎即可. 外部操作有受力, 动量(速度相关).

另外, 物体之间还有一种约束关系(连接关系), 用于弹簧, 绳索, 转轴之类的模拟, 这里不考虑.

如果不需要多个场景, 可以把程序对象合并进物理对象, 只是为了方便使用, 设计的话太复杂了反而成了过度设计.

以Bullet的.net wapper为例, 它只在C-API的基础上抽象了三个对象:

这只是最基本的功能, 不过在这基础上添加受力, 材质属性什么的就很容易了.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大史住在大前端

javascript基础修炼(7)——Promise,异步,可靠性

Promise技术是【javascript异步编程】这个话题中非常重要的,它一度让我感到熟悉又陌生,我熟悉其所有的API并能够在编程中相对熟练地运用,却对其中原...

785
来自专栏技术分享

.NET应用架构设计—面向查询服务的参数化查询设计(分解业务点,单独配置各自的数据查询契约)

阅读目录: 1.背景介绍 2.对业务功能点进行逻辑划分(如:A、B、C分别三个业务点) 2.1.配置映射关系,对业务点配置查询契约(构造VS插件方便生成查询契...

1988
来自专栏我是攻城师

如何使用neo4j存储树形无限级菜单

3906
来自专栏Java社区

Java核心技术讲解学习

1093
来自专栏二进制文集

Java 与 C/C++ 的编译器对比

这两天重温了周志明的《深入理解Java虚拟机》第2版,发现第11章第4节关于 Java 编译器的内容写得太棒了~本文完全摘自《深入理解Java虚拟机》第2版 0...

736
来自专栏华仔的技术笔记

iOS应用架构谈 本地持久化方案及动态部署

嗯,你们要的大招。跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者...

3297
来自专栏高爽的专栏

Java线程(一):线程安全与不安全

        作为一个Java web开发人员,很少也不需要去处理线程,因为服务器已经帮我们处理好了。记得大一刚学Java的时候,老师带着我们做了一个局域网聊...

1710
来自专栏老秦求学

汇编语言学习01

汇编语言(8086cpu) 恩,学习一门课程,我觉得应该有一定的条理性,而且自己要勤加思考才能学好,条理性:最好就是先整体的介绍一下全本书,然后再详细的介绍各个...

2729
来自专栏计算机视觉与深度学习基础

Leetcode 29 Divide Two Integers 位操作的巧妙运用

Divide two integers without using multiplication, division and mod operator. I...

1916
来自专栏云飞学编程

Python的面向过程、面向函数、面向对象的区别浅谈

有人之前私信问我,python编程有面向过程、面向函数、面向对象三种,那么他们区别在哪呢?这个问题,让我想起我在学习编程的时候,我的老师给我举的例子。分享给大家...

872

扫码关注云+社区