目录

  • 一、数据类型
    • 1. b a s i c d a t a t y p e s \ basic \ data \ types  basic data types
    • 2. O b j e c t s a n d I D s \ Objects \ and \ IDs  Objects and IDs
    • 3. A r g u m e n t c o n v e n t i o n s Argument \ conventions Argument conventions
  • 二、基本流程
  • 二、碰撞检测
    • 1. c o l l i s i o n t e s t s s u p p o r t e d collision \ tests \ supported collision tests supported
    • 2. c o n t a c t p o i n t s contact \ points contact points
    • 3. G e o m s Geoms Geoms
    • 4. S p a c e s Spaces Spaces
    • 5. C o l l i s i o n d e t e c t i o n Collision \ detection Collision detection

一、数据类型

1. b a s i c d a t a t y p e s \ basic \ data \ types  basic data types

   d R e a l dReal dReal 代表浮点数,其他数据类型由 d R e a l dReal dReal 构成的数组实现。

2. O b j e c t s a n d I D s \ Objects \ and \ IDs  Objects and IDs

   d S p a c e dSpace dSpace与 d G e o m dGeom dGeom在碰撞检测中会遇到。

3. A r g u m e n t c o n v e n t i o n s Argument \ conventions Argument conventions

   凡是涉及到”set“的函数,传入的参数是独立的;凡是涉及到”get“的函数,返回的是 d R e a l dReal dReal数组的指针;坐标默认是世界坐标系下的坐标。

二、基本流程

1.创建世界:

dWorldID dWorldCreate();

2.创建 s p a c e space space:
三种不同的 s p a c e space space,每一种采用不同的数据结构存储几何体,根据不同的算法作碰撞检测。

dSpaceID dSimpleSpaceCreate (dSpaceID space);
dSpaceID dHashSpaceCreate (dSpaceID space);
dSpaceID dQuadTreeSpaceCreate (dSpaceID space, dVector3 Center, dVector3 Extents, int Depth);

3.创建物体:

dBodyID dBodyCreate (dWorldID);

4.设置物体位姿(位置与姿态)与速度(线速度与角速度):

void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z);
void dBodySetRotation (dBodyID, const dMatrix3 R);
void dBodySetQuaternion (dBodyID, const dQuaternion q);
void dBodySetLinearVel  (dBodyID, dReal x, dReal y, dReal z);
void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z);
const dReal * dBodyGetPosition (dBodyID);
const dReal * dBodyGetRotation (dBodyID);
const dReal * dBodyGetQuaternion (dBodyID);
const dReal * dBodyGetLinearVel (dBodyID);
const dReal * dBodyGetAngularVel (dBodyID);"set"传入独立参数,"get"获得数组指针

5.添加质量和力:

//Mass用一个结构体来描述,包含质量,质心,惯量矩阵
typedef struct dMass {dReal mass; // total mass of the rigid bodydVector3 c; // center of gravity position in body frame (x,y,z)dMatrix3 I; // 3x3 inertia tensor in body frame, about POR
} dMass;
//例:Box对应的Mass,此外还有cylinder等
//参数:Mass地址,密度,长,宽,高
void dMassSetBox (dMass *, dReal density, dReal lx, dReal ly, dReal lz);
void dBodySetMass (dBodyID, const dMass *mass);
/*添加力*/
void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz);

6.创建几何体:

dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz);

7.模拟:

//参数:窗口宽度与高度,模拟时调的函数
void dsSimulationLoop(int argc, char **argv,int window_width, int window_height, dsFunctions *fn)

二、碰撞检测

1. c o l l i s i o n t e s t s s u p p o r t e d collision \ tests \ supported collision tests supported

2. c o n t a c t p o i n t s contact \ points contact points

碰撞点信息由一个结构体描述:

struct dContactGeom {dVector3 pos;    // contact positiondVector3 normal; // normal vectordReal depth;     // penetration depthdGeomID g1,g2;   // the colliding geoms
};

3. G e o m s Geoms Geoms

  在碰撞系统中,几何体是基本对象,一个几何体可以代表一个刚体形状,也可以代表一群,即 s p a c e space space。几何体之间的碰撞产生碰撞信息, s p a c e space space可以产生内部几何体的碰撞点。
  几何体分为 p l a c e b l e placeble placeble与 n o n − p a l c e b l e non-palceble non−palceble,前者和刚体一样,有位姿信息,后者没有。 p l a c e b l e g e o m s placeble \ geoms placeble geoms和刚体对象联系起来做刚体模拟, g e o m s geoms geoms可以设置形状,大小,位姿, o b j e c t object object可以设置动力学属性,如速度,质量,二者结合起来构成模拟的对象。 d G e o m S e t B o d y dGeomSetBody dGeomSetBody函数将 b o d y body body与 g e o m geom geom结合起来,修改 b o d y body body的位姿会改变与之对应的 g e o m geom geom的位姿,同样地,修改 g e o m geom geom的位姿会改变 b o d y body body的位姿。

void dGeomSetBody (dGeomID, dBodyID);

4. S p a c e s Spaces Spaces

   s p a c e space space在碰撞系统中类似于刚体中的 w o r l d world world,可以在 s p a c e space space内创建几何体,这样在做碰撞检测时,调用 d S p c e C o l l i d e dSpceCollide dSpceCollide函数可以快速识别到可能会碰撞的几何体,筛选出的这些几何体再传入 d C o l l i d e dCollide dCollide函数( c a l l b a c k callback callback函数调用 d C o l l i d e dCollide dCollide函数),相较于将所有几何体都传入 d C o l l i d e dCollide dCollide函数,该方法显然更快。

5. C o l l i s i o n d e t e c t i o n Collision \ detection Collision detection

1. d C o l l i d e dCollide dCollide函数生成两个相交几何体的碰撞点。

int dCollide (dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, int skip);

∗ c o n t a c t * contact ∗contact是指向碰撞点结构体数组的指针,如果两个几何体碰撞,该函数返回碰撞点数量,反之返回0。

2. d S p a c e C o l l i d e dSpaceCollide dSpaceCollide函数检测一个 s p a c e space space内可能会相交的几何体对,之后传入 c a l l b a c k callback callback函数。 d S p a c e C o l l i d e dSpaceCollide dSpaceCollide函数不直接产生碰撞点,用户可以自定义 c a l l b a c k callback callback函数。

void dSpaceCollide (dSpaceID space, void *data, dNearCallback *callback);
typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2);

参数 d a t a data data由 d S p a c e C o l l i d e dSpaceCollide dSpaceCollide直接传入 d N e a r C a l l b a c k dNearCallback dNearCallback,候选对中若出现其它的 s p a c e space space,只将其作为 d N e a r C a l l b a c k dNearCallback dNearCallback的一个参数传入,不会递归调用。

3. d S p a c e C o l l i d e 2 dSpaceCollide2 dSpaceCollide2函数检测两个 s p a c e space space内可能会相交的几何体,这一对几何体分别位于两个 s p a c e space space内。

void dSpaceCollide2 (dGeomID o1, dGeomID o2, void *data, dNearCallback *callback);

ODE(open dynamics engine) (1)相关推荐

  1. Open Dynamics Engine(ODE)简介

    Russell Smith 的 Open Dynamics Engine(ODE)是一个开源的物理引擎,使用它可以仿真铰接式固形体运动.这样不管我们使用哪种图形库(可能使用 OpenGL),都可以对真 ...

  2. ODE(Open Dynamics Engine)学习笔记

    https://tech.hqew.com/fangan_788777 此外,在ODE仿真环境中,可通过两种方式来模拟弹簧-阻尼系统: (1)通过设置ERP(Error Reduction Param ...

  3. C/C++ 框架,类库,资源集合

    很棒的 C/C++ 框架,类库,资源集合. Awesome C/C++ Standard Libraries Frameworks Artificial Intelligence Asynchrono ...

  4. 【CG物理模拟系列】开篇:介绍(下)

    上一篇介绍了CG物体模拟的定义,流程及种类,这一篇讲下物理模拟常用手法,物理模拟引擎,从物理模拟+3DCG程序的编写・到导出结果动画的处理顺序. 物理模拟常用手法 粒子法(Particle Metho ...

  5. 机器人系统常用仿真软件介绍和效果

    机器人系统常用仿真软件介绍和效果 1 主要介绍以下七种仿真平台(侧重移动机器人仿真而非机械臂等工业机器人仿真): 1.1  USARSim-Unified System for Automation ...

  6. 机器人系统常用仿真软件介绍效果与评价指标

    本文转载自博主zhangrelay:http://blog.csdn.net/ZhangRelay/article/details/42586491 转载过来,方便自己查看,感谢原博主. 机器人系统常 ...

  7. 成为游戏开发程序员,要学些什么

    一.游戏程序开发的工作主要包括哪些方面 游戏开发中的程序开发主要由如下几个方面组成:  1.图形引擎  2.声音引擎  3.物理引擎  4.游戏引擎  5.人工智能或游戏逻辑  6.游戏GUI界面(菜 ...

  8. 如何成为一名游戏开发程序员

    一.游戏程序开发的工作主要包括哪些方面 游戏开发中的程序开发主要由如下几个方面组成: 1.图形引擎 2.声音引擎 3.物理引擎 4.游戏引擎 5.人工智能或游戏逻辑 6.游戏GUI界面(菜单) 7.游 ...

  9. 游戏引擎与虚拟仿真系统

    转自 http://blog.csdn.net/imedia_3d/article/details/5335086 1.      3D游戏引擎.仿真软件和图形引擎概述 目前3D图形技术大量应用于游戏 ...

最新文章

  1. DIY强大的虚拟化环境-技术可行性部分
  2. 你有哪些 Deep learning(RNN、CNN)调参的经验?
  3. mysql数据是怎么存储的_mysql数据是怎么存储的
  4. 解析:IEEE批准首个联邦机器学习框架标准
  5. springboot实现增量备份_SpringBoot canal数据同步解决方案
  6. c++ 输出string_来讲讲Java中String 类的知识点
  7. “无继承”情况下的对象构造
  8. Vue学习--MVVM模型
  9. 【笔记】Java如何判断是IDE启动还是jar启动
  10. 阿里矢量图标库项目添加合作者
  11. 【AcWing】语法基础课听课笔记
  12. Java高级篇-----jdk1.8新特性
  13. 使用git clone 遇见git did not exit cleanly (exit code 128)的个人解决方案
  14. java 去除引号_java如何用replaceAll去除字符串中的引号
  15. 2022年危险化学品经营单位安全管理人员考题及答案
  16. echarts——实现3D地图+3D柱状图 效果——粗糙代码记录——技能提升
  17. Arduino和Python螺旋桨角度数学模型
  18. 域名信息备案管理系统php,工信部备案系统域名变更已启用新域名
  19. PostgreSQL的GROUP BY问题
  20. 51单片机之点亮一个灯

热门文章

  1. Swift 十六进制颜色转换
  2. java char 动态数组_Java程序来填充char数组中的元素
  3. 【±5V集成稳压电源Multisim设计】
  4. 勿以善小而不为,勿以恶小而为之
  5. Mac 显示允许任何来源
  6. 在站点新建lxwm的html文件,小溪空间
  7. Python实现股票数据分析的可视化
  8. 一口气看完大唐安史之乱
  9. Python使用库(二)
  10. 这次破纪录的黑洞喷发可能会覆盖天空中的16次满月