Ammo.js物理引擎

511 阅读34分钟

一、概述

  1. Ammo.js 是一款基于 Emscripten 技术,将著名的 Bullet 物理引擎直接移植到 JavaScript 中的工具。它通过代码编译的方式,将 Bullet 的源代码原汁原味地转换为 JavaScript,而无需人工重写,从而确保了其功能与原始项目完全一致。

  2. Bullet Physics 是一款开源的物理模拟引擎,也是全球三大顶尖物理引擎之一,与 Havok 和 PhysX 并驾齐驱。

ammo引擎相关示例资源查看

其他引擎介绍,可以查看下面文档

物理引擎

二、参考文章

【Ammo物理引擎】

www.dwenzhao.cn/profession/…

【threejs 物理引擎ammo自学】

www.jianshu.com/p/d2d7dbade…

感谢以上文章作者提供的资料与教程

三、物理引擎

创建一个带物理属性的模型的流程

物理世界启动

  1. 物理世界的类型
  • 为了模拟不同材质的物体,物理世界也对应出了不同的分支

  1. 物理世界的配置
  • 创建物理世界,需要传入不同参数,定制化其效果
  • 刚体世界 示例代码:
//完全碰撞检测算法
let collisionConfiguration = new Ammo.btDefaultCollisionConfiguration();
// 重叠对/碰撞的调度计算
let dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);
// 所有可能碰撞对的宽相位碰撞检测列表
let broadphase = new Ammo.btDbvtBroadphase();
// 使物体正确地交互,考虑重力、力、碰撞等
let solver = new Ammo.btSequentialImpulseConstraintSolver();
physicsWorld = new Ammo.btDiscreteDynamicsWorld( dispatcher, broadphase, solver, collisionConfiguration);

  1. 物理世界中 碰撞参数与物理世界之间的对应关系

碰撞算法物理世界
btDefaultCollisionConfigurationbtDiscreteDynamicsWorld
btSoftBodyRigidBodyCollisionConfigurationbtSoftRigidDynamicsWorld

三、常用的类:

  1. btVector3类:三维向量类

该类使用频率很高,由3个浮点数类型的x、y、z变量组成,可以表示速度、点、力等向量。

1)构造器:

构造器含义
btVector3()创建一个三维分量初始值都为零的三维向量对象
btVector3(x,y,z)创建三维向量对象,三个坐标值分别为x、y、z

2)方法:

方法含义
setX(x)设置向量的x坐标值
setY(y)设置向量的y坐标值
setZ(z)设置向量的z坐标值
setValue(x,y,z)设置向量的坐标
normalize()将向量归一化为单位向量
dot(btVector3 v)获取与向量v的点积
op_mul(btVector3 v)计算当前向量与向量 v 的叉积
op_add(btVector3 v)计算当前向量与向量 v 的和
op_sub(btVector3 v)计算当前向量与向量 v 的差

示例代码

// 创建一个三维向量
const vec = new Ammo.btVector3(1, 2, 3);

// 设置向量的分量
vec.setX(4);
vec.setY(5);
vec.setZ(6);

// 归一化向量
vec.normalize();

// 计算点积和叉积
const vec2 = new Ammo.btVector3(7, 8, 9);
const dotProduct = vec.dot(vec2); // 点积
const crossProduct = vec.op_mul(vec2); // 叉积

// 向量加法和减法
const sum = vec.op_add(vec2); // 向量和
const difference = vec.op_sub(vec2); // 向量差

2. ## btTransform类:变换类

该类由位置和方向组合而成,用来表示刚体的变换,如平移、旋转等。

1)构造器:

构造器含义
btTransform()无参构造函数,创建一个单位变换(即没有旋转和平移)
btTransform(btQuaternion q, btVector3 v)变换的构造函数,q表示变换旋转信息的四元数,v表示变换平移信息的向量

2)方法:

方法含义
setIdentity()将当前变换对象设置为单位变换,即旋转变换矩阵归一化,平移向量的三个维度分量归零
setOrigin(btVector3 origin)设置平移变换的向量,origin 为平移变换的向量(不是 3x3 矩阵)
setRotation(btQuaternion rotation)设置当前变换对象的旋转变换数据,rotation 表示存储旋转数据的四元数对象
getOrigin()换取变换的原点
getRotation()换取表示旋转信息的四元数
getBasic()换取表示变换信息的3x3矩阵
setFromOpenGLMatrix(m)设置变换的矩阵,m为旋转平移缩放向量合成的4x4变换矩阵首地址

补充说明

  • btTransform 类用于表示刚体的变换,包括平移和旋转。
  • btQuaternion 类表示的四元数用于对三维向量进行旋转变换。

示例代码

// 创建一个单位变换
const transform = new Ammo.btTransform();

// 设置平移和旋转
const origin = new Ammo.btVector3(1, 2, 3);
const rotation = new Ammo.btQuaternion(0, 0, 0, 1);
transform.setOrigin(origin);
transform.setRotation(rotation);

// 获取平移和旋转
const origin = transform.getOrigin();
const rotation = transform.getRotation();

3. ## btRigidBody类:刚体类

该类用于存储刚体的一些属性信息,包括线速度、角速度、摩擦系数等,其中封装了多种方法,用于设置和获取相关属性信息。

1)构造器:

构造器含义
btRigidBody(btRigidBodyConstructionInfo constructionInfo)创建一个刚体对象,constructionInfo 为刚体信息对象,包含质量、运动状态、碰撞形状、惯性张量等

2)方法:

方法含义
getCenterOfMassTransform()获取刚体的重心变换,返回值为 Ammo.btTransform 对象,表示刚体的重心位置和旋转
setCenterOfMassTransform(btTransform xform)设置刚体的重心变换,xform 为需要设置的变换对象
setDamping(lin_damping,ang_damping)设置线性阻尼系数和角阻尼系数,用于模拟摩擦和空气阻力等
getLinearVelocity()获取刚体的线速度,返回值为 Ammo.btVector3 对象,表示刚体的线速度向量
getAngularVelocity()获取刚体的角速度,返回值为 Ammo.btVector3 对象,表示刚体的角速度向量
setAngularFactor(btVector3 angularFactor)设置角速度因子,用于限制刚体的旋转
getMotionState()获取刚体的运动状态,返回值为 Ammo.btMotionState 对象,包含刚体的位置和旋转信息
applyCentralForce(btVector3 force)应用中心力,force 为提供的力向量,作用于刚体的重心
applyTorch(btVector3 torquel)应用扭矩,torque 为要应用的刚体扭矩
applyForce(btVector3 force, btVector3 rel_pos)应用力,force 为要应用的力,rel_pos 为施加力的位置(相对于刚体的重心)
applyCentralImpulse(btVector3 impulse)应用中心冲量,impulse 为要应用的冲量,作用于刚体的重心
applyTorqueImpulse(btVector3 torque)应用扭矩冲量,torque 为要应用的冲量
applyImpulse ( btVector3 impulse, btVector3 rel_pos)应用冲量,impulse 为要应用的冲量,rel_pos 为要施加冲量的位置坐标(相对于刚体的重心)

补充说明

  • btRigidBody 类是物理引擎中刚体的核心类,用于表示具有质量、速度、旋转等属性的物理对象。
  • 通过这些方法,可以设置和获取刚体的运动状态、应用力和冲量,以及控制刚体的旋转行为。

示例代码

// 创建刚体信息对象
const rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);
const rigidBody = new Ammo.btRigidBody(rbInfo);

// 设置阻尼系数
rigidBody.setDamping(0.1, 0.1);

// 应用中心力
const force = new Ammo.btVector3(0, 10, 0);
rigidBody.applyCentralForce(force);

// 应用扭矩
const torque = new Ammo.btVector3(0, 0, 5);
rigidBody.applyTorque(torque);

// 获取线速度和角速度
const linearVelocity = rigidBody.getLinearVelocity();
const angularVelocity = rigidBody.getAngularVelocity();

4. ## btDynamicsWorld类:物理世界类

该类有两个重要的子类,离散物理世界类btDiscreteDynamicsWorld和用于测试的类btSimpleDynamicsWorld类。

1)构造器:

构造器含义
btDynamicsWorld(btDispatcher dispatcher, btBroadphaseInterface broadphase, btCollisionConfiguration collisionConfiguration)- 含义:物理世界类构造器。
  • 参数

    • dispatcher:碰撞检测算法分配器的引用,用于管理碰撞检测逻辑。
    • broadphase:宽阶段碰撞检测接口的引用,用于快速筛选可能碰撞的物体。
    • collisionConfiguration:碰撞检测配置信息的引用,用于定义碰撞检测的行为。 |

2)方法:

方法含义
stepSimulation(timeStep)进行世界物理模拟,timeStep为时间步进
addConstraint(btTypedConstraint constraint)在物理世界中添加约束,constraint为约束引用
removeConstraint(btTypedConstraint constraint)在物理世界删除约束,constraint为约束引用
setGravity(gravity)设置物理世界的重力,gravity为重力向量
addRidgidBody(btRidgidBody body)在物理世界添加刚体,body为要添加的刚体
removeRidgidBody(btRidgidBody body)删除物理世界的刚体
getNumConstraints()获取物理世界的约束总数
getConstraint(index)获取物理世界中的指定约束,index为约束索引
getNumCollisionObjects()获取物理世界中碰撞物体的数量
getCollisionObjectArray()获取物理世界中碰撞物体的数组
contactTest ( btCollisionObject colObj, ContactResultCallback resultCallback)进行接触检测,colObj为指向碰撞物体类的引用,resultCallback为接触回调类的对象
  1. btDiscreteDynamicsWorld类:离散物理世界类

实际开发中常使用该类来创建物理世界对象,创建时要使用构造器,需要给出碰撞检测算法分配器、碰撞检测粗测算法接口和碰撞检测配置接口。

1)构造器:

构造器含义
btDiscreteDynamicsWorld(btDispatcher dispatcher, btBroadphaseInterface pairCache, btConstraintSolver constraintSolver, btCollisionConfiguration conf)- 作用:创建一个离散物理世界对象。
  • 参数

    •   dispatcher:碰撞检测算法分配器,负责管理碰撞检测的具体实现。
    •   pairCache:碰撞检测的宽相检测接口(btBroadphaseInterface),用于快速筛选可能碰撞的物体对。
    •   constraintSolver:约束求解器,用于解决物理世界中的约束(如关节、碰撞响应等)。
    •   conf:碰撞检测配置信息,用于初始化碰撞检测系统。 |

2)方法:

方法含义
btCollisionWorld getCollisionWorld()获取当前物理世界的碰撞世界(btCollisionWorld)的引用

补充说明

  • btDiscreteDynamicsWorld 是物理世界的核心类,用于模拟刚体的动态行为(如运动、碰撞、约束等)。

  • 在实际开发中,创建物理世界时需要提供以下组件:

    • 碰撞检测算法分配器( btDispatcher :负责管理碰撞检测的具体实现。
    • 宽相检测接口( btBroadphaseInterface :用于快速筛选可能碰撞的物体对。
    • 约束求解器( btConstraintSolver :用于解决物理世界中的约束(如关节、碰撞响应等)。
    • 碰撞检测配置( btCollisionConfiguration :用于初始化碰撞检测系统。

示例代码

// 创建物理世界的各个组件
const collisionConfiguration = new Ammo.btDefaultCollisionConfiguration();
const dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);
const broadphase = new Ammo.btDbvtBroadphase();
const solver = new Ammo.btSequentialImpulseConstraintSolver();

// 创建物理世界
const physicsWorld = new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);

// 设置重力
physicsWorld.setGravity(new Ammo.btVector3(0, -9.8, 0));

// 获取碰撞世界
const collisionWorld = physicsWorld.getCollisionWorld();

6. ## btSoftRigidDynamicsWorld类:支持模拟软体的物理世界

可支持模拟软体,继承了btDiscreteDynamicsWorld类。所谓软体,不具有固定形状,可像软布一样改变本身形状的物体。

1)构造器:

构造器含义
btSoftRigidDynamicsWorld(btDispatcher dispatcher, btBroadphaseInterface pairCache, btConstraintSolver constraintSolver, btCollisionConfiguration conf, btSoftBodySolver softBodySolver)- 作用:创建一个支持软体和刚体模拟的物理世界。
  • 参数

    • dispatcher:碰撞检测算法分配器,负责管理碰撞检测的具体实现。
    • pairCache:碰撞检测的宽相检测接口,用于快速筛选可能碰撞的物体对。
    • constraintSolver:约束求解器,用于解决物理世界中的约束(如关节、碰撞响应等)。
    • conf:碰撞检测配置信息,用于初始化碰撞检测系统。
    • softBodySolver:软体求解器,用于处理软体物体的物理模拟。 |

2)方法:

方法含义
addSoftBody(btSoftBody body)向物理世界添加物体,body为指向软体的引用
removeSoftBody(btSoftBody body)从物理世界删除指定软体

补充说明

  • btSoftRigidDynamicsWorldbtDiscreteDynamicsWorld 的扩展类,增加了对软体物体的支持。
  • 软体物体(如布料、绳索等)不具有固定形状,可以在物理模拟中改变自身形状。
  • 创建软体物体时,通常需要使用 btSoftBodyHelpersbtSoftBodyWorldInfo 等辅助类。

示例代码

// 创建物理世界的各个组件
const collisionConfiguration = new Ammo.btSoftBodyRigidBodyCollisionConfiguration();
const dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);
const broadphase = new Ammo.btDbvtBroadphase();
const solver = new Ammo.btSequentialImpulseConstraintSolver();
const softBodySolver = new Ammo.btDefaultSoftBodySolver();

// 创建支持软体的物理世界
const physicsWorld = new Ammo.btSoftRigidDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration, softBodySolver);

// 设置重力
physicsWorld.setGravity(new Ammo.btVector3(0, -9.8, 0));

// 创建软体物体并添加到物理世界
const softBody = createSoftBody(); // 假设有一个创建软体的函数
physicsWorld.addSoftBody(softBody);

// 删除软体物体
physicsWorld.removeSoftBody(softBody);

7. ## btCollisionShape类:碰撞形状类

该类封装了一些判断碰撞形状类型的方法,所有碰撞形状都直接或间接继承自此类。方法有:

1)构造器:

构造器含义
btCollisionShape ( )碰撞形状构造器

2)方法:

方法含义
setLocalScaling(btVector3 scaling)设置缩放比
calculateLocalInertia(mass, btVector3 inertia)计算碰撞形状的惯性张量,mass为质量,inertia为惯性
setMargin(margin)设置碰撞形状的边界(margin)
getMargin()获取碰撞形状的边界值

补充说明

  • btCollisionShape 是所有碰撞形状的基类,所有具体的碰撞形状(如 btBoxShapebtSphereShapebtCapsuleShape 等)都继承自该类。
  • 这些方法提供了对碰撞形状的基本操作,包括设置缩放、计算惯性张量和设置边界。

示例代码

// 创建一个碰撞形状(例如立方体形状)
const shape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));

// 设置局部缩放
const scaling = new Ammo.btVector3(2, 2, 2);
shape.setLocalScaling(scaling);

// 计算惯性张量
const inertia = new Ammo.btVector3(0, 0, 0);
const mass = 1.0; // 物体质量
shape.calculateLocalInertia(mass, inertia);

// 设置边界
const margin = 0.05;
shape.setMargin(margin);

// 获取边界
const currentMargin = shape.getMargin();
console.log("Current Margin:", currentMargin);

8. ## btBoxShape类:长方体盒碰撞形状

该类可用于盒子、箱子等规则物体。

1)构造器:

构造器含义
btBoxShape(btVector3 boxHalfExtents)作用:创建一个长方体盒碰撞形状。参数boxHalfExtents:一个 btVector3 对象,表示长方体的半区域(即长、宽、高的一半)。说明btBoxShape 是一个用于表示长方体碰撞形状的类,通常用于模拟盒子、箱子等规则物体。boxHalfExtents 定义了长方体在 x、y、z 三个轴上的半尺寸。

2)方法:

方法含义
setMargin(margin)设置碰撞形状的边界值
getMargin()获取碰撞形状的边界值

补充说明

  btBoxShapebtCollisionShape 的一个子类,专门用于表示长方体碰撞形状。

  它继承了 btCollisionShape 的所有方法和属性,因此可以使用 setLocalScalingcalculateLocalInertia 等方法。

  btBoxShape 的构造器需要一个 btVector3 对象,表示长方体的半区域(即长、宽、高的一半)。

示例代码

// 创建一个长方体盒碰撞形状
const halfExtents = new Ammo.btVector3(1, 2, 3); // 半区域为 (1, 2, 3)
const boxShape = new Ammo.btBoxShape(halfExtents);

// 设置边界值
const margin = 0.05;
boxShape.setMargin(margin);

// 获取边界值
const currentMargin = boxShape.getMargin();
console.log("Current Margin:", currentMargin);

9. ## btStaticPlaneShape类:静态平面形状

该类表示静态的平面,如地面、屋顶等,创建时需要给出法向量。

1)构造器:

构造器含义
btStaticPlaneShape(btVector3 planeNormal,float planeConstant)- 作用:创建一个静态平面形状。
  • 参数

    • planeNormal:平面的法向量,表示平面的方向。
    • planeConstant:平面方程中的常数项,用于定义平面的位置。
  • 说明

    • 静态平面形状通常用于表示地面、墙壁、屋顶等不会移动的平面。

    • 平面的方程可以表示为 np+d=0,其中:

      • n 是法向量(planeNormal)。
      • p 是平面上的任意一点。
      • d 是常数项(planeConstant)。 |

2)方法:

方法含义
getPlaneNormal()获取平面形状的法向量
getPlaneConstant()获取平面方程中的常数项

补充说明

  • btStaticPlaneShapebtCollisionShape 的一个子类,专门用于表示静态平面。
  • 静态平面通常用于表示地面、墙壁等不会移动的物体。
  • 平面的法向量和常数项共同定义了平面的位置和方向。

示例代码

// 创建一个静态平面形状
const planeNormal = new Ammo.btVector3(0, 1, 0); // 平面法向量,指向 y 轴
const planeConstant = 0; // 平面方程中的常数项,表示平面通过原点
const planeShape = new Ammo.btStaticPlaneShape(planeNormal, planeConstant);

// 获取平面的法向量
const normal = planeShape.getPlaneNormal();
console.log("Plane Normal:", normal.x(), normal.y(), normal.z());

// 获取平面的常数项
const constant = planeShape.getPlaneConstant();
console.log("Plane Constant:", constant);

10. ## btSphereShape类:球体形状

该类表示一个球体。

1)构造器:

构造器含义
btSphereShape(radius)球体碰撞形状构造器,radius为球半径

2)方法:

方法含义
setMargin(margin)设置碰撞形状的边界值
getMargin()获取碰撞形状的边界值
getRadius( )获取球体的半径

补充说明

  • btSphereShapebtCollisionShape 的一个子类,专门用于表示球体碰撞形状。
  • 球体形状在物理模拟中非常常用,例如模拟球体的碰撞、运动等。

示例代码

// 创建一个球体碰撞形状
const radius = 1.0; // 球体半径
const sphereShape = new Ammo.btSphereShape(radius);

// 设置边界值
const margin = 0.05;
sphereShape.setMargin(margin);

// 获取边界值
const currentMargin = sphereShape.getMargin();
console.log("Current Margin:", currentMargin);

// 获取球体的半径
const sphereRadius = sphereShape.getRadius();
console.log("Sphere Radius:", sphereRadius);

11. ## btCylinderShape类:圆柱形状

该类表示一个圆柱形状,如杆、金币、石柱等都可以采用此类,但碰撞计算量较大,不如胶囊。

1)构造器:

构造器含义
btCylinderShape(btVector3 halfExtents)- 作用:创建一个圆柱形状。
  • 参数

    • halfExtents:一个 btVector3 对象,表示圆柱的半区域。

      • 第1维(x)和第3维(z)表示圆柱的半径。
      • 第2维(y)表示圆柱的高度的一半。
  • 说明btCylinderShape 是一个用于表示圆柱碰撞形状的类,通常用于模拟圆柱形物体(如杆、石柱等)。构造器需要一个 btVector3 对象来定义圆柱的尺寸。 |

2)方法:

方法含义
getRadius( )获取圆柱的半径

补充说明

  • btCylinderShapebtCollisionShape 的一个子类,专门用于表示圆柱碰撞形状。
  • 圆柱形状在物理模拟中非常常用,例如模拟圆柱形物体的碰撞、运动等。
  • 你提到的“碰撞计算量较大,不如胶囊”是正确的。btCylinderShape 的碰撞检测相对复杂,计算量较大。相比之下,btCapsuleShape(胶囊形状)在某些情况下可能更高效,尤其是在模拟人体或其他类似形状时。

示例代码

// 创建一个圆柱碰撞形状
const halfExtents = new Ammo.btVector3(0.5, 1.0, 0.5); // 半区域为 (0.5, 1.0, 0.5)
const cylinderShape = new Ammo.btCylinderShape(halfExtents);

// 获取圆柱的半径
const radius = cylinderShape.getRadius();
console.log("Cylinder Radius:", radius);

12. ## btCapsuleShape类:胶囊形状

该类表示一个胶囊形状,碰撞计算量比圆柱小,旗杆、铅笔等一般使用该类。

1)构造器:

构造器含义
btCapsuleShape(float radius,float height)- 作用:创建一个胶囊形状。
  • 参数

    • radius:胶囊两端球面的半径。
    • height:胶囊中间圆柱部分的长度。
  • 说明btCapsuleShape 是一个用于表示胶囊碰撞形状的类,通常用于模拟胶囊形物体(如旗杆、铅笔等)。构造器需要两个参数来定义胶囊的尺寸。 |

2)方法:

方法含义
getRadius( )获取胶囊截面的半径
getHalfHeight( )获取中间圆柱部分长度值的一半

补充说明

  • btCapsuleShapebtCollisionShape 的一个子类,专门用于表示胶囊碰撞形状。
  • 胶囊形状在物理模拟中非常常用,例如模拟人体、旗杆、铅笔等物体的碰撞、运动等。
  • 你提到的“碰撞计算量比圆柱小”是正确的。btCapsuleShape 的碰撞检测相对简单,计算量较小。相比之下,btCylinderShape(圆柱形状)的碰撞检测相对复杂,计算量较大。

示例代码

// 创建一个胶囊碰撞形状
const radius = 0.5; // 胶囊两端球面的半径
const height = 2.0; // 胶囊中间圆柱部分的长度
const capsuleShape = new Ammo.btCapsuleShape(radius, height);

// 获取胶囊的半径
const capsuleRadius = capsuleShape.getRadius();
console.log("Capsule Radius:", capsuleRadius);

// 获取胶囊中间圆柱部分长度的一半
const halfHeight = capsuleShape.getHalfHeight();
console.log("Capsule Half Height:", halfHeight);

13. ## btConeShape类:圆锥形状类

该类表示圆锥形状。

1)构造器:

构造器含义
btConeShape(float radius, float height)- 作用:创建一个圆锥形状。
  • 参数

    • radius:圆锥底面的半径。
    • height:圆锥的高度。
  • 说明btConeShape 是一个用于表示圆锥碰撞形状的类,通常用于模拟圆锥形物体(如锥体、金字塔等)。构造器需要两个参数来定义圆锥的尺寸。 |

2)方法:

方法含义
getRadius()获取圆锥的半径
getHeight()获取圆锥的高度

补充说明

  • btConeShapebtCollisionShape 的一个子类,专门用于表示圆锥碰撞形状。
  • 圆锥形状在物理模拟中可以用于模拟各种圆锥形物体的碰撞和运动。

示例代码

// 创建一个圆锥碰撞形状
const radius = 0.5; // 圆锥底面的半径
const height = 1.0; // 圆锥的高度
const coneShape = new Ammo.btConeShape(radius, height);

// 获取圆锥底面的半径
const coneRadius = coneShape.getRadius();
console.log("Cone Radius:", coneRadius);

// 获取圆锥的高度
const coneHeight = coneShape.getHeight();
console.log("Cone Height:", coneHeight);

14. ## btCompoundShape类:复合形状

该类表示一个复合形状,可以通过创建多个单一形状组合成一个复合形状对象。

1)构造器:

构造器含义
btCompoundShape()- 作用:创建一个复合形状对象。
  • 说明btCompoundShape 是一个用于表示复合碰撞形状的类,可以通过组合多个单一形状(如球体、立方体、圆柱等)来创建更复杂的碰撞形状。 |

2)方法:

方法含义
addChildShape (btTransform localTransform, btCollisionShape shape)- 作用:向复合形状中添加一个子形状。
  • 参数

    • localTransform:一个 btTransform 对象,表示子形状相对于复合形状的局部变换(位置和旋转)。
    • shape:一个 btCollisionShape 对象,表示要添加的子形状。
  • 说明:通过这个方法,可以将多个单一形状组合成一个复合形状。 | | removeChildShape( childShapeindex) | - 作用:从复合形状中删除指定的子形状。

  • 参数

    • childShapeIndex:子形状的索引。
  • 说明:通过这个方法,可以根据子形状的索引从复合形状中移除它 | | getNumChildShapes() | - 作用:获取复合形状中子形状的数量。

  • 返回值:返回复合形状中子形状的数量。

  • 说明:此方法用于查询复合形状中包含的子形状数量。 | | getChildShape(index) | - 作用:获取复合形状中指定索引的子形状。

  • 参数

    • index:子形状的索引。
  • 返回值:返回指定索引的子形状对象。

  • 说明:此方法用于访问复合形状中的某个子形状。 |

补充说明

  • btCompoundShapebtCollisionShape 的一个子类,专门用于表示复合碰撞形状。
  • 复合形状可以包含多个单一形状,每个子形状都有自己的局部变换(位置和旋转)。
  • 复合形状在物理模拟中非常有用,例如模拟复杂的物体(如机器人、车辆等)。

示例代码

// 创建一个复合形状
const compoundShape = new Ammo.btCompoundShape();

// 创建一个立方体形状
const boxShape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
const boxTransform = new Ammo.btTransform();
boxTransform.setIdentity();
boxTransform.setOrigin(new Ammo.btVector3(0, 0, 0)); // 设置立方体的位置
compoundShape.addChildShape(boxTransform, boxShape);

// 创建一个球体形状
const sphereShape = new Ammo.btSphereShape(0.5);
const sphereTransform = new Ammo.btTransform();
sphereTransform.setIdentity();
sphereTransform.setOrigin(new Ammo.btVector3(2, 0, 0)); // 设置球体的位置
compoundShape.addChildShape(sphereTransform, sphereShape);

// 获取复合形状中子形状的数量
const numShapes = compoundShape.getNumChildShapes();
console.log("Number of child shapes:", numShapes);

// 获取复合形状中第一个子形状
const firstShape = compoundShape.getChildShape(0);
console.log("First child shape type:", firstShape.getShapeType());

15. ## btRaycastVehicle类:交通工具类

交通工具类是模拟现实世界中的交通工具,有刚体车身、四个轮子,支持前轮驱动和后轮驱动,支持车轮转向等,提供了添加和更新车轮的方法,设置车轮刹车的方法。

1)构造器:

构造器含义
btRaycastVehicle(vehicleTuning,chassis,raycaster)- 作用:创建一个交通工具对象。
  • 参数

    • vehicleTuning:一个 btVehicleTuning 对象,用于设置车辆的悬挂、摩擦等参数。
    • chassis:一个 btRigidBody 对象,表示车辆的车身。
    • raycaster:一个 btCollisionWorld 对象,用于射线检测,确定车轮与地面的接触点。 |

2)方法:

方法含义
updateAction (btCollisionWorld collisionWorld,btScalar step)- 作用:更新交通工具的状态。
  • 参数

    • collisionWorld:物理世界的引用。
    • step:时间步长。
  • 说明:此方法用于在物理模拟中更新车辆的状态,包括车轮的运动、悬挂的动态等。 | | btTransform getChassisWorldTransform() | - 作用:获取车辆车身的世界变换。

  • 返回值:返回一个 btTransform 对象,表示车辆车身的当前位置和旋转。 | | updateVehicle(btScalar step) | - 作用:更新交通工具的状态。

  • 参数

    • step:时间步长。
  • 说明:此方法用于更新车辆的状态,通常在物理模拟的每一帧调用。 | | resetSuspension() | - 作用:重置悬挂系统的参数。

  • 说明:此方法用于将悬挂系统恢复到初始状态,通常在车辆重置或重新初始化时调用。 | | getSteeringValue (wheelindex) | - 作用:获取指定车轮的转向系数。

  • 参数

    • wheelIndex:车轮的索引。
  • 返回值:返回指定车轮的转向系数 | | setSteeringValue(steering, wheelindex) | - 作用:设置指定车轮的转向系数。

  • 参数

    • steering:要设置的转向系数。
    • wheelIndex:车轮的索引。 | | applyEngineForce(btScalar force,int wheelindex) | - 作用:在指定车轮上应用驱动力。
  • 参数

    • force:驱动力的大小。
    • wheelIndex:车轮的索引。 | | updateWheelTransform(wheelindex) | - 作用:更新指定车轮的变换对象。
  • 参数

    • wheelIndex:车轮的索引。 | | btWheelInfo addWheel (btVector3 connectionPointCS0, btVector3 wheelDirectionCS0,btVector3 wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRsdius,btVehicleTuning tuning,boolean isFrontWheel) | - 作用:给交通工具添加车轮。
  • 参数

    • connectionPointCS0:车轮连接点的位置。
    • wheelDirectionCS0:车轮的方向。
    • wheelAxleCS:车轮的轴向量。
    • suspensionRestLength:悬挂系统在松弛状态下的长度。
    • wheelRadius:车轮的半径。
    • tuning:车辆调优参数。
    • isFrontWheel:是否为前轮(前轮通常用于转向) | | getNumWheels() | - 作用:获取交通工具上的车轮总数。
  • 返回值:返回车轮的数量。 | | btWheelInfo getWheelInfo(index) | - 作用:获取指定车轮的信息。

  • 参数

    • index:车轮的索引。
  • 返回值:返回一个 btWheelInfo 对象,包含车轮的详细信息。 | | setBrake(btScalar brake, index) | - 作用:设置指定车轮的刹车系数。

  • 参数

    • brake:刹车系数的大小。
    • index:车轮的索引。 | | updateSuspension (btScalar deltaTime) | - 作用:更新悬挂系统。
  • 参数

    • deltaTime:时间步长。 | | updateFriction(btScalar timeStep) | - 作用:更新车辆的摩擦。
  • 参数

    • timeStep:时间步长。 | | btRigidBody getRigidBody() | - 作用:获取车辆的刚体。
  • 返回值:返回车辆车身的 btRigidBody 对象。 | | btVector3 getForwardVector() | - 作用:获取车辆的前进向量。

  • 返回值:返回一个 btVector3 对象,表示车辆的前进方向。 | | btScalar getCurrentSpeedKmHour() | - 作用:获取车辆的当前速度(单位:千米/小时)。

  • 返回值:返回车辆的当前速度。 | | setCoordinateSystem(rightIndex, upIndex, forwardIndex) | - 作用:设置车辆的坐标系统。

  • 参数

    • rightIndex:右方向的索引。
    • upIndex:上方向的索引。
    • forwardIndex:前进方向的索引 | | getUserConstrainType () | - 作用:获取用户自定义的约束类型。
  • 返回值:返回用户自定义的约束类型。 | | setUserConstrainType(userConstraintType) | - 作用:设置用户自定义的约束类型。

  • 参数

    • userConstraintType:要设置的约束类型。 | | setUserConstraintId(uid) | - 作用:设置用户自定义的约束 ID。
  • 参数

    • uid:要设置的约束 ID。 | | getUserConstraintId() | - 作用:获取用户自定义的约束 ID。
  • 返回值:返回用户自定义的约束 ID。 |

补充说明

  • btRaycastVehicle 是一个用于模拟交通工具的类,支持复杂的车辆动力学,包括悬挂系统、车轮转向、驱动力和刹车等。
  • 该类继承自 btActionInterface,可以作为物理世界中的一个动作对象,通过 updateAction 方法更新车辆的状态。
  • 车辆的每个车轮都有自己的悬挂系统和动力学参数,可以通过 addWheel 方法添加车轮,并通过 setSteeringValueapplyEngineForcesetBrake 等方法控制车辆的运动。

示例代码

// 创建车辆调优参数
const tuning = new Ammo.btVehicleTuning();

// 创建车辆车身的刚体
const chassisShape = new Ammo.btBoxShape(new Ammo.btVector3(1, 0.5, 2));
const chassisMass = 1000;
const chassisTransform = new Ammo.btTransform();
chassisTransform.setIdentity();
const chassisMotionState = new Ammo.btDefaultMotionState(chassisTransform);
const chassisInertia = new Ammo.btVector3(0, 0, 0);
chassisShape.calculateLocalInertia(chassisMass, chassisInertia);
const chassisRigidBodyCI = new Ammo.btRigidBodyConstructionInfo(chassisMass, chassisMotionState, chassisShape, chassisInertia);
const chassisRigidBody = new Ammo.btRigidBody(chassisRigidBodyCI);

// 创建射线检测器
const raycaster = new Ammo.btCollisionWorldClosestRayResultCallback(new Ammo.btVector3(0, 0, 0), new Ammo.btVector3(0, -1, 0));

// 创建车辆
const vehicle = new Ammo.btRaycastVehicle(tuning, chassisRigidBody, raycaster);

// 添加车轮
vehicle.addWheel(
    new Ammo.btVector3(1, 0, 1), // 车轮连接点
    new Ammo.btVector3(0, -1, 0), // 车轮方向
    new Ammo.btVector3(-1, 0, 0), // 车轮轴向量
    0.3, // 悬挂系统在松弛状态下的长度
    0.5, // 车轮半径
    tuning,
    true // 是否为前轮
);

// 更新车辆状态
vehicle.updateAction(physicsWorld, deltaTime);

// 设置车轮转向
vehicle.setSteeringValue(0.5, 0); // 设置第一个车轮的转向系数为 0.5

// 应用驱动力
vehicle.applyEngineForce(100, 2); // 在第三个车轮上应用驱动力

// 设置刹车
vehicle.setBrake(10, 3); // 在第四个车轮上设置刹车系数为 10

16. ## btSoftBodyHelps类:软体帮助类

软体是不同于固定形状的刚体,如绳索,可以实现拉伸、弯曲等不同姿态,如软布可以呈现上下波动。创建软体时必须使用软体帮助类,该类提供了创建软体的方法:

方法含义
CreateRope(btSoftBodyWorldInfo worldInfo,btVector3 from,btVector3 to,int res,int fixeds)作用:创建绳索软体。参数:  worldInfo:软体世界信息,包含物理世界的配置。  from:绳索的起点位置。  to:绳索的终点位置。  res:分辨率,表示绳索的分段数量。  fixeds:固定点数量,表示绳索两端是否固定
CreatePatch(btSoftBodyWorldInfo worldInfo,btVector3 corner00,btVector3 corner10,btVector3 corner01,btVector3 corner11,int resx,int resy,int fixeds,bool gendiags)作用:创建软布。参数:  worldInfo:软体世界信息。  corner00corner10corner01corner11:软布四个角的坐标。  resxresy:软布的分辨率,分别表示顶点的列数和行数。  fixeds:固定点数量。  gendiags:是否生成对角线约束,true 表示生成。
CreateEllipsoid(btSoftBodyWorldInfo worldInfo,btVector3 center,btVector3 radius,int res)作用:创建椭球软体。参数:  worldInfo:软体世界信息。  center:椭球的中心点坐标。  radius:椭球的半径。  res:分辨率。
CreateFromTriMesh(btSoftBodyWorldInfo worldInfo,btVector3[] vertices,int[] triangles,int ntriangles,bool randomizeConstraints)作用:从三角形网格创建软体。参数:  worldInfo:软体世界信息。  vertices:顶点数组,表示网格的顶点坐标。  triangles:三角形索引数组,表示三角形的顶点索引。  ntriangles:三角形的总数。  randomizeConstraints:是否随机化约束。

补充说明

  • btSoftBodyHelpers 提供了一系列方法来创建不同类型的软体,如绳索、布料和椭球。
  • 这些方法需要 btSoftBodyWorldInfo 参数,它包含了软体世界的基本信息,例如物理世界的配置。
  • 创建软体时,可以通过参数控制软体的形状、分辨率和固定点等属性。

四、关节:

  1. btTypedConstraint 类:关节的父类

btTypedConstraint 是所有关节类的基类,封装了关节的通用方法和属性。关节用于约束两个物体之间的相对运动,例如固定关节、铰链关节、滑动关节等。

1)构造器为:

构造器含义
btTypedConstraint()- 作用:创建一个关节对象。
  • 说明btTypedConstraint 是一个抽象类,通常不会直接实例化,而是通过其子类(如 btHingeConstraintbtSliderConstraint 等)来创建具体的关节。 |

2)方法:

方法含义
getBreakingImpulseThreshold()- 作用:获取毁坏关节的最大冲量。
  • 返回值:返回一个浮点数,表示毁坏关节的最大冲量阈值。

  • 说明:当关节受到的冲量超过这个阈值时,关节可能会被破坏或失效。 | | setBreakingImpulseThreshold( threshold) | - 作用:设置毁坏关节的最大冲量。

  • 参数

    • threshold:要设置的冲量阈值。
  • 说明:通过设置这个值,可以控制关节在受到多大冲量时会被破坏或失效。 |

补充说明

  • btTypedConstraint 是所有关节类的基类,提供了关节的通用方法和属性。
  • 具体的关节类型(如 btHingeConstraintbtSliderConstraint 等)继承自 btTypedConstraint,并实现了特定的约束行为。
  • 关节通常用于连接两个刚体(btRigidBody),并约束它们之间的相对运动。

示例代码

// 创建两个刚体
const bodyA = new Ammo.btRigidBody(...); // 刚体 A
const bodyB = new Ammo.btRigidBody(...); // 刚体 B

// 创建一个具体的关节(例如铰链关节)
const hingeConstraint = new Ammo.btHingeConstraint(bodyA, bodyB, ...);

// 获取毁坏关节的最大冲量
const breakingImpulse = hingeConstraint.getBreakingImpulseThreshold();
console.log("Breaking Impulse Threshold:", breakingImpulse);

// 设置毁坏关节的最大冲量
const newThreshold = 100.0; // 新的冲量阈值
hingeConstraint.setBreakingImpulseThreshold(newThreshold);
console.log("New Breaking Impulse Threshold:", newThreshold);

关节主要有铰链关节、滑动关节、六自由度关节、点对点关节等。

  1. 铰链关节btHingeConstraint:

铰链是仅有一个旋转自由度的关节,通过铰链的约束限制,相关刚体仅能绕铰链轴旋转。

1)构造器:

构造器含义
btHingeConstraint(btRigidBody rbA,btRigidBody rbB,btVector3 pivotInA,btVector3 pivotInB,btVector3 axisInA,btVector3 axisInB,boolean useReferenceFrameA)- 作用:创建一个铰链关节,连接两个刚体。
  • 参数

    • rbArbB:两个要连接的刚体。
    • pivotInApivotInB:分别表示两个刚体的铰链中心点(局部坐标系)。
    • axisInAaxisInB:分别表示两个刚体的旋转轴(局部坐标系)。
    • useReferenceFrameA:是否使用 rbA 的参考框架来定义关节的变换关系。默认值为 false。 | | btHingeConstraint(btRigidBody rbA,btVector3 pivotInA,btVector3 axisInA,boolean useReferenceFrameA) | - 作用:创建一个铰链关节,连接一个刚体和世界坐标系。
  • 参数

    • rbA:要连接的刚体。
    • pivotInA:刚体的铰链中心点(局部坐标系)。
    • axisInA:刚体的旋转轴(局部坐标系)。
    • useReferenceFrameA:是否使用 rbA 的参考框架来定义关节的变换关系。默认值为 false。 | | btHingeConstraint(btRigidBody rbA,btRigidBody rbB,btTransform rbAFrame,btTransform rbBFrame,boolean useReferenceFrameA) | - 作用:创建一个铰链关节,连接两个刚体,使用变换对象定义关节的相对位置和方向。
  • 参数

    • rbArbB:两个要连接的刚体。
    • rbAFramerbBFrame:分别表示两个刚体的变换对象(局部坐标系)。
    • useReferenceFrameA:是否使用 rbA 的参考框架来定义关节的变换关系。默认值为 false。 | | btHingeConstraint(btRigidBody rbA,btTransform rbAFrame,boolean useReferenceFrameA) | - 作用:创建一个铰链关节,连接一个刚体和世界坐标系,使用变换对象定义关节的相对位置和方向。
  • 参数

    • rbA:要连接的刚体。
    • rbAFrame:刚体的变换对象(局部坐标系)。
    • useReferenceFrameA:是否使用 rbA 的参考框架来定义关节的变换关系。默认值为 false。 |

2)方法:

方法含义
getHingeAngle()- 作用:获取铰链当前的旋转角度值。
  • 返回值:返回当前的旋转角度(单位:弧度)。 | | setLimit ( float low, float high) | - 作用:设置铰链的转动范围。

  • 参数

    • low:旋转角度的下限值(单位:弧度)。
    • high:旋转角度的上限值(单位:弧度)。 | | getLowerLimit() | - 作用:获取转动角度的下限值。
  • 返回值:返回旋转角度的下限值(单位:弧度)。 | | getUpperLimit() | - 作用:获取转动角度的上限值。

  • 返回值:返回旋转角度的上限值(单位:弧度)。 | | enableAngularMotor (boolean enableMotor,float targetVelocity,float maxMotorImpulse) | - 作用:启动或停止角马达。

  • 参数

    • enableMotor:是否启用角马达。
    • targetVelocity:目标角速度(单位:弧度/秒)。
    • maxMotorImpulse:马达的最大冲量。 | | setAngularOnly(boolean angularOnly) | - 作用:设置是否仅允许角运动。
  • 参数

    • angularOnly:是否仅允许角运动。 | | enableMotor(boolean enableMotor) | - 作用:启用或禁用马达。
  • 参数

    • enableMotor:是否启用马达。 | | setMaxMotorImpulse(maxMotorImpluse) | - 作用:设置马达的最大冲量。
  • 参数

    • maxMotorImpulse:马达的最大冲量。 |

马达用于模拟提供动力的部件。

  1. 滑动关节btSliderConstraint:

滑动关节(btSliderConstraint)是一种约束,允许两个刚体之间沿一条轴线进行平移和旋转运动。它通常用于模拟类似螺丝和螺母的机械结构,或需要限制运动范围的场景。

1)构造器:

构造器含义
btSliderConstraint(btRigidBody rbA,btRigidBody rbB,btTransform frameInA,btTransform frameInB,boolean useLinearReferenceFrameA)- 作用:创建一个滑动关节,连接两个刚体。
  • 参数

    • rbArbB:需要连接的两个刚体。
    • frameInAframeInB:分别表示在刚体 rbArbB 的局部坐标系中,约束点的位置和方向(通过变换矩阵 btTransform 定义)。
    • useLinearReferenceFrameA:布尔值,决定参考坐标系的选择。如果为 true,则以 rbA 的局部坐标系为参考;如果为 false,则以 rbB 的局部坐标系为参考。 | | btSliderConstraint(btRigidBody rbA,btTransform frameInA,boolean useLinearReferenceFrameA) | - 作用:创建一个滑动关节,连接一个刚体和世界坐标系。
  • 参数

    • rbA:需要连接的单个刚体。
    • frameInA:约束点在刚体 rbA 的局部坐标系中的位置和方向(通过变换矩阵 btTransform 定义)。
    • useLinearReferenceFrameA:布尔值,决定参考坐标系的选择。如果为 true,则以 rbA 的局部坐标系为参考;如果为 false,则以世界坐标系为参考。 |

2)方法:

方法含义
setUpperLinLimit ( float upperLimit)设置滑动关节滑动距离上限
setLowerLinLimit ( float lowerLimit)设置滑动关节滑动距离下限
getUpperLinLimit()获取滑动距离的上限值
getLowerLinLimit()获取滑动距离的下限值
setUpperAngLimit ( float upperLimit)设置滑动关节转动角度上限
setLowerAngLimit ( float lowerLimit)设置滑动关节转动角度下限
getUpperAngLimit()获取转动角度的上限值
getLowerAngLimit()获取转动角度的下限值
setDampingDirLin(float dampingDirLin)设置关节的滑动阻尼系数
setDampingDirAng(float dampingDirAng)设置关节的转动阻尼系数
getDampingDirLin()获取关节的滑动阻尼系数
getDampingDirAng()获取关节的转动阻尼系数
setPoweredLinMotor ( boolean onOff)设置是否启动滑动对应的马达
setMaxLinMotorForce (float maxLinMotorForce)设置驱动滑动马达的最大力
setTargetLinMotorVelocity (float targetLinMotorVelocity)设置驱动滑动马达的速度
setPoweredAngMotor ( boolean onOff)设置是否启动转动对应的马达
setMaxAngMotorForce (float maxAngMotorForce)设置驱动转动马达的最大力
setTargetAngMotorVelocity (float targetangMotorVelocity)设置驱动转动马达的速度
  1. 齿轮关节btGearConstraint:

齿轮关节(btGearConstraint)用于模拟现实世界中两个齿轮之间的转动关系。它确保两个刚体围绕各自的轴旋转时,保持一定的转动比例。这种约束通常用于机械系统,例如齿轮传动装置。

1)构造器:

构造器含义
btGearConstraint(btRigidBody rbA,btRigidBody rbB,btVector3 axisA,btVector3 axisB,float ratio)- 作用:创建一个齿轮关节,连接两个刚体。
  • 参数

    • rbArbB:需要连接的两个刚体。
    • axisAaxisB:分别表示刚体 rbArbB 的旋转轴向量(在世界坐标系中定义)。
    • ratio:齿轮之间的转动比例,表示两个刚体角速度之间的关系。例如,如果 ratio = 2,则当 rbA 每旋转一圈时,rbB 旋转两圈。 |

2)方法:

方法含义
setAxisA ( btVector3 axisA)设置与刚体 rbA 关联的旋转轴向量。
setAxisB ( btVector3 axisB)设置与刚体 rbB 关联的旋转轴向量。
gettAxisA()获取与刚体 rbA 关联的旋转轴向量。
gettAxisB()获取与刚体 rbB 关联的旋转轴向量
setRatio ( ratio)设置齿轮关节的转动比例
getRatio( )获取齿轮关节的转动比例
  1. 点对点关节btPoint2PointConstraint:

用于模拟两个刚体之间通过一个点进行连接的效果。它确保两个刚体上的指定点始终保持在同一位置,但允许刚体之间自由旋转。这种约束常用于模拟链条、关节或悬挂系统。

1)构造器:

构造器含义
btPoint2PointConstraint(btRigidBody rbA,btRigidBody rbB,btVector3 pivotInA,btVector3 pivotInB)- 含义:创建一个点对点约束,连接两个刚体。
  • 参数

    • rbArbB:需要连接的两个刚体。
    • pivotInApivotInB:分别表示关节在刚体 rbArbB 的局部坐标系中的位置(即连接点的位置) | | btPoint2PointConstraint(btRigidBody rbA,btVector3 pivotInA) | - 含义:创建一个点对点约束,将一个刚体上的点固定在世界坐标系中的某个位置。
  • 参数

    • rbA:需要连接的单个刚体。
    • pivotInA:关节在刚体 rbA 的局部坐标系中的位置。 |

2)方法:

方法含义
setPivotA ( btVector3 pivotA)设置关节在刚体 rbA 的局部坐标系中的位置
setPivotB ( btVector3 pivotB)设置关节在刚体 rbB 的局部坐标系中的位置
getPivotInA ()获取关节在刚体 rbA 的局部坐标系中的位置
getPivotInB ()获取关节在刚体 rbB 的局部坐标系中的位置
  1. 六自由度关节btGeneric6DofConstraint:

一种复杂的约束,允许刚体在三个平移自由度和三个旋转自由度上运动。通过限制或锁定某些自由度,它可以模拟各种机械结构和生物关节,例如机械臂、肘关节、颈关节等。

1)构造器:

构造器含义
btGeneric6DofConstraint(btRigidBody rbA,btRigidBody rbB,btTransform frameInA,btTransform frameInB,boolean useLinearReferenceFrameA)- 含义:创建一个六自由度约束,连接两个刚体。
  • 参数

    • rbArbB:需要连接的两个刚体。
    • frameInAframeInB:分别表示在刚体 rbArbB 的局部坐标系中,约束点的位置和方向(通过变换矩阵 btTransform 定义)。
    • useLinearReferenceFrameA:布尔值,决定参考坐标系的选择。如果为 true,则以 rbA 的局部坐标系为参考;如果为 false,则以 rbB 的局部坐标系为参考。 | | btGeneric6DofConstraint(btRigidBody rbA,btTransform frameInA,boolean useLinearReferenceFrameA) | - 含义:创建一个六自由度约束,连接一个刚体和世界坐标系。
  • 参数

    • rbA:需要连接的单个刚体。
    • frameInA:约束点在刚体 rbA 的局部坐标系中的位置和方向(通过变换矩阵 btTransform 定义)。
    • useLinearReferenceFrameA:布尔值,决定参考坐标系的选择。如果为 true,则以 rbA 的局部坐标系为参考;如果为 false,则以世界坐标系为参考。 |

2)方法:

方法含义
setLinearUpperLimit (btVector3 linearUpper)设置线性自由度的上限
setLinearLowerLimit ( btVector3 linearLower)设置线性自由度的下限
getLinearUpperLimit()获取线性自由度的上限
getLinearLowerLimit()获取线性自由度的下限
seAngularUpperLimit ( btVector3 angularUpper)设置角自由度的上限
setAngularLowerLimit ( btVector3 angularLower)设置角自由度的下限
getAngularUpperLimit()获取角自由度的上限
getAngularLowerLimit()获取角自由度的下限
getAngular(int axis_index)获取指定轴的旋转角度(基于欧拉角)axis_index:轴的索引(0、1、2 分别对应 X、Y、Z 轴)