当前位置: 首页 > 工具软件 > ODE > 使用案例 >

ODE手册(3)数据类型和惯例

耿和韵
2023-12-01

3.1 基本数据类型

  ODE库可以被编译为使用单精度或双精度浮点数据类型。使用单精度时,模拟在占用较小内存空间的同时会取得较快的速度,但是会引起更多的数值型误差而且会引起可见的错误。另一方面,在使用单精度时会降低模拟的精确度和稳定性(必须说明哪些因素会影响到模拟的精确度和稳定性)。浮点型数据类型有dReal和其它一些常用的类型dVector3、dMatrix3、dQuaternion。矢量类浮点型数据类型都是通过简单的dReals数组实现的。它们的设计惯例如下:

名称 实现 格式
dQuaternion dReal[4] [w,x,y,z]w表示实数部分,(x,y,z)表示向量部分
dVectors4 dReal[4] [x,y,z,1.0]
dVectors3 dReal[4] 和dVectors4一样;第四个元数只是为了更好地对齐,应该忽略
dMatrix4 dReal[4*4] 一个4X4的矩阵,元素被设计为行优先序列,通常被当作一个奇次变换矩阵。也就是说位于左上3X3的元数是一个旋转矩阵,最后一列的第一个三元组是一个平移向量,最后一行就简化为[0,0,0,1]
dMatrix3 dReal[3*3] yige 3X3的矩阵,元素被设计为行优先序列。最后一列被忽略,并且同dVector3一样,仅仅用于更好地对齐

 3.2对象和ID

  在ODE中可以创建很多种对象:

  • dWorld:表示一个动力学世界,包含所有的仿真数据
  • dBody:表示一个刚体,没有任何形状:需要一个或更多的dGeom
  • dJoint:表示一个关节
  • dJointGroup:表示一个关节组,可以很容易地实现一次销毁所有的关节
  • dSpace:表示一个碰撞空间,用于组织和加速碰撞测试
  • dGeom:表示用于检测碰撞的形状
  在ODE中的各种函数处理这些对象并返回对象ID,常见的对象ID有dWorldID,dBodyID等等。
3.3 参数和惯例

  所有的3元向量(x,y,z)都通过“set”函数通过给定单独的x,y,z参数进行初始化;

  所有的3元向量都可以通过“get”函数获取一个指向dReal型数组的值;

  较大的向量通常都通过dReal型数组指针给定值或者返回结果;

  默认所有坐标都在全局坐标系中除非特别声明。

3.4 C v.s. C++

  ODE库是用C++写的,但是它的公共接口是由简单的C函数组成的,而不是类,这是为什么呢?

  • 使用C接口仅仅是为了更简单—C++的特点对ODE并不是很有帮助
  • 阻止C++识别和“运行时”,支持交叉编译
  • 使用ODE的用户并不一定需要熟悉C++模式
  有一个半官方的c++ 封装和ODE的库文件一起发布(在odecpp*.h文件中,但是有一些设计上的限制)
3.5 调试

  ODE的库文件可以被编译为“调试”或“发布”模式。调试模式虽然较慢,但是函数参数会被检测并且会做很多run-time测试以确保内部一致性;发布模式虽然较快但是不会做任何检查。

 
  排雷区:(用于对一些非本博文主题内的技术名词和其它关键词进行简要介绍)

  wrapper:(封装)在实际的程序开发过程中,我们通常会为不同的应用设计适应于不同编程语言、环境接入的接口,对于这种接口的处理,通常称之为wrapper。在此篇博文中出现的wrapper就是一种ODE针对C++提供的接口。

  run-time:(运行时)在程序开发的过程中,我们通常会将此过程分为多个阶段,也成为不同的时期(主要有compile time、link time、load time、run time等)。运行时表示程序运行、执行的时期。通常所说的run-time测试、错误主要针对的就是程序在运行阶段的各种测试和出现的各种错误。

 类似资料: