一、概述
-
Ammo.js 是一款基于 Emscripten 技术,将著名的 Bullet 物理引擎直接移植到 JavaScript 中的工具。它通过代码编译的方式,将 Bullet 的源代码原汁原味地转换为 JavaScript,而无需人工重写,从而确保了其功能与原始项目完全一致。
-
Bullet Physics 是一款开源的物理模拟引擎,也是全球三大顶尖物理引擎之一,与 Havok 和 PhysX 并驾齐驱。
ammo引擎相关示例资源查看
-
官网示例地址 - schteppe.github.io/ammo.js-dem…
-
物理引擎在github上的地址 - github.com/kripken/amm…
-
three.js官网dome - threejs.org/examples/?q…
其他引擎介绍,可以查看下面文档
二、参考文章
【Ammo物理引擎】
【threejs 物理引擎ammo自学】
感谢以上文章作者提供的资料与教程
三、物理引擎
创建一个带物理属性的模型的流程
物理世界启动
- 物理世界的类型
- 为了模拟不同材质的物体,物理世界也对应出了不同的分支
- 物理世界的配置
- 创建物理世界,需要传入不同参数,定制化其效果
- 刚体世界 示例代码:
//完全碰撞检测算法
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);
- 物理世界中 碰撞参数与物理世界之间的对应关系
| 碰撞算法 | 物理世界 |
|---|---|
| btDefaultCollisionConfiguration | btDiscreteDynamicsWorld |
| btSoftBodyRigidBodyCollisionConfiguration | btSoftRigidDynamicsWorld |
三、常用的类:
-
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为接触回调类的对象 |
-
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) | 从物理世界删除指定软体 |
补充说明
btSoftRigidDynamicsWorld是btDiscreteDynamicsWorld的扩展类,增加了对软体物体的支持。- 软体物体(如布料、绳索等)不具有固定形状,可以在物理模拟中改变自身形状。
- 创建软体物体时,通常需要使用
btSoftBodyHelpers和btSoftBodyWorldInfo等辅助类。
示例代码
// 创建物理世界的各个组件
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是所有碰撞形状的基类,所有具体的碰撞形状(如btBoxShape、btSphereShape、btCapsuleShape等)都继承自该类。- 这些方法提供了对碰撞形状的基本操作,包括设置缩放、计算惯性张量和设置边界。
示例代码
// 创建一个碰撞形状(例如立方体形状)
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() | 获取碰撞形状的边界值 |
补充说明
btBoxShape 是 btCollisionShape 的一个子类,专门用于表示长方体碰撞形状。
它继承了 btCollisionShape 的所有方法和属性,因此可以使用 setLocalScaling、calculateLocalInertia 等方法。
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:平面方程中的常数项,用于定义平面的位置。
-
说明:
-
静态平面形状通常用于表示地面、墙壁、屋顶等不会移动的平面。
-
平面的方程可以表示为 n⋅p+d=0,其中:
- n 是法向量(
planeNormal)。 - p 是平面上的任意一点。
- d 是常数项(
planeConstant)。 |
- n 是法向量(
-
2)方法:
| 方法 | 含义 |
|---|---|
| getPlaneNormal() | 获取平面形状的法向量 |
| getPlaneConstant() | 获取平面方程中的常数项 |
补充说明
btStaticPlaneShape是btCollisionShape的一个子类,专门用于表示静态平面。- 静态平面通常用于表示地面、墙壁等不会移动的物体。
- 平面的法向量和常数项共同定义了平面的位置和方向。
示例代码
// 创建一个静态平面形状
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( ) | 获取球体的半径 |
补充说明
btSphereShape是btCollisionShape的一个子类,专门用于表示球体碰撞形状。- 球体形状在物理模拟中非常常用,例如模拟球体的碰撞、运动等。
示例代码
// 创建一个球体碰撞形状
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( ) | 获取圆柱的半径 |
补充说明
btCylinderShape是btCollisionShape的一个子类,专门用于表示圆柱碰撞形状。- 圆柱形状在物理模拟中非常常用,例如模拟圆柱形物体的碰撞、运动等。
- 你提到的“碰撞计算量较大,不如胶囊”是正确的。
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( ) | 获取中间圆柱部分长度值的一半 |
补充说明
btCapsuleShape是btCollisionShape的一个子类,专门用于表示胶囊碰撞形状。- 胶囊形状在物理模拟中非常常用,例如模拟人体、旗杆、铅笔等物体的碰撞、运动等。
- 你提到的“碰撞计算量比圆柱小”是正确的。
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() | 获取圆锥的高度 |
补充说明
btConeShape是btCollisionShape的一个子类,专门用于表示圆锥碰撞形状。- 圆锥形状在物理模拟中可以用于模拟各种圆锥形物体的碰撞和运动。
示例代码
// 创建一个圆锥碰撞形状
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:子形状的索引。
-
返回值:返回指定索引的子形状对象。
-
说明:此方法用于访问复合形状中的某个子形状。 |
补充说明
btCompoundShape是btCollisionShape的一个子类,专门用于表示复合碰撞形状。- 复合形状可以包含多个单一形状,每个子形状都有自己的局部变换(位置和旋转)。
- 复合形状在物理模拟中非常有用,例如模拟复杂的物体(如机器人、车辆等)。
示例代码
// 创建一个复合形状
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方法添加车轮,并通过setSteeringValue、applyEngineForce和setBrake等方法控制车辆的运动。
示例代码
// 创建车辆调优参数
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:软体世界信息。 corner00、corner10、corner01、corner11:软布四个角的坐标。 resx、resy:软布的分辨率,分别表示顶点的列数和行数。 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参数,它包含了软体世界的基本信息,例如物理世界的配置。 - 创建软体时,可以通过参数控制软体的形状、分辨率和固定点等属性。
四、关节:
-
btTypedConstraint 类:关节的父类
btTypedConstraint 是所有关节类的基类,封装了关节的通用方法和属性。关节用于约束两个物体之间的相对运动,例如固定关节、铰链关节、滑动关节等。
1)构造器为:
| 构造器 | 含义 |
|---|---|
| btTypedConstraint() | - 作用:创建一个关节对象。 |
- 说明:
btTypedConstraint是一个抽象类,通常不会直接实例化,而是通过其子类(如btHingeConstraint、btSliderConstraint等)来创建具体的关节。 |
2)方法:
| 方法 | 含义 |
|---|---|
| getBreakingImpulseThreshold() | - 作用:获取毁坏关节的最大冲量。 |
-
返回值:返回一个浮点数,表示毁坏关节的最大冲量阈值。
-
说明:当关节受到的冲量超过这个阈值时,关节可能会被破坏或失效。 | | setBreakingImpulseThreshold( threshold) | - 作用:设置毁坏关节的最大冲量。
-
参数:
threshold:要设置的冲量阈值。
-
说明:通过设置这个值,可以控制关节在受到多大冲量时会被破坏或失效。 |
补充说明
btTypedConstraint是所有关节类的基类,提供了关节的通用方法和属性。- 具体的关节类型(如
btHingeConstraint、btSliderConstraint等)继承自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);
关节主要有铰链关节、滑动关节、六自由度关节、点对点关节等。
-
铰链关节btHingeConstraint:
铰链是仅有一个旋转自由度的关节,通过铰链的约束限制,相关刚体仅能绕铰链轴旋转。
1)构造器:
| 构造器 | 含义 |
|---|---|
| btHingeConstraint(btRigidBody rbA,btRigidBody rbB,btVector3 pivotInA,btVector3 pivotInB,btVector3 axisInA,btVector3 axisInB,boolean useReferenceFrameA) | - 作用:创建一个铰链关节,连接两个刚体。 |
-
参数:
rbA和rbB:两个要连接的刚体。pivotInA和pivotInB:分别表示两个刚体的铰链中心点(局部坐标系)。axisInA和axisInB:分别表示两个刚体的旋转轴(局部坐标系)。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) | - 作用:创建一个铰链关节,连接两个刚体,使用变换对象定义关节的相对位置和方向。
-
参数:
rbA和rbB:两个要连接的刚体。rbAFrame和rbBFrame:分别表示两个刚体的变换对象(局部坐标系)。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:马达的最大冲量。 |
马达用于模拟提供动力的部件。
-
滑动关节btSliderConstraint:
滑动关节(btSliderConstraint)是一种约束,允许两个刚体之间沿一条轴线进行平移和旋转运动。它通常用于模拟类似螺丝和螺母的机械结构,或需要限制运动范围的场景。
1)构造器:
| 构造器 | 含义 |
|---|---|
| btSliderConstraint(btRigidBody rbA,btRigidBody rbB,btTransform frameInA,btTransform frameInB,boolean useLinearReferenceFrameA) | - 作用:创建一个滑动关节,连接两个刚体。 |
-
参数:
rbA和rbB:需要连接的两个刚体。frameInA和frameInB:分别表示在刚体rbA和rbB的局部坐标系中,约束点的位置和方向(通过变换矩阵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) | 设置驱动转动马达的速度 |
-
齿轮关节btGearConstraint:
齿轮关节(btGearConstraint)用于模拟现实世界中两个齿轮之间的转动关系。它确保两个刚体围绕各自的轴旋转时,保持一定的转动比例。这种约束通常用于机械系统,例如齿轮传动装置。
1)构造器:
| 构造器 | 含义 |
|---|---|
| btGearConstraint(btRigidBody rbA,btRigidBody rbB,btVector3 axisA,btVector3 axisB,float ratio) | - 作用:创建一个齿轮关节,连接两个刚体。 |
-
参数:
rbA和rbB:需要连接的两个刚体。axisA和axisB:分别表示刚体rbA和rbB的旋转轴向量(在世界坐标系中定义)。ratio:齿轮之间的转动比例,表示两个刚体角速度之间的关系。例如,如果ratio = 2,则当rbA每旋转一圈时,rbB旋转两圈。 |
2)方法:
| 方法 | 含义 |
|---|---|
| setAxisA ( btVector3 axisA) | 设置与刚体 rbA 关联的旋转轴向量。 |
| setAxisB ( btVector3 axisB) | 设置与刚体 rbB 关联的旋转轴向量。 |
| gettAxisA() | 获取与刚体 rbA 关联的旋转轴向量。 |
| gettAxisB() | 获取与刚体 rbB 关联的旋转轴向量 |
| setRatio ( ratio) | 设置齿轮关节的转动比例 |
| getRatio( ) | 获取齿轮关节的转动比例 |
-
点对点关节btPoint2PointConstraint:
用于模拟两个刚体之间通过一个点进行连接的效果。它确保两个刚体上的指定点始终保持在同一位置,但允许刚体之间自由旋转。这种约束常用于模拟链条、关节或悬挂系统。
1)构造器:
| 构造器 | 含义 |
|---|---|
| btPoint2PointConstraint(btRigidBody rbA,btRigidBody rbB,btVector3 pivotInA,btVector3 pivotInB) | - 含义:创建一个点对点约束,连接两个刚体。 |
-
参数:
rbA和rbB:需要连接的两个刚体。pivotInA和pivotInB:分别表示关节在刚体rbA和rbB的局部坐标系中的位置(即连接点的位置) | | btPoint2PointConstraint(btRigidBody rbA,btVector3 pivotInA) | - 含义:创建一个点对点约束,将一个刚体上的点固定在世界坐标系中的某个位置。
-
参数:
rbA:需要连接的单个刚体。pivotInA:关节在刚体rbA的局部坐标系中的位置。 |
2)方法:
| 方法 | 含义 |
|---|---|
| setPivotA ( btVector3 pivotA) | 设置关节在刚体 rbA 的局部坐标系中的位置 |
| setPivotB ( btVector3 pivotB) | 设置关节在刚体 rbB 的局部坐标系中的位置 |
| getPivotInA () | 获取关节在刚体 rbA 的局部坐标系中的位置 |
| getPivotInB () | 获取关节在刚体 rbB 的局部坐标系中的位置 |
-
六自由度关节btGeneric6DofConstraint:
一种复杂的约束,允许刚体在三个平移自由度和三个旋转自由度上运动。通过限制或锁定某些自由度,它可以模拟各种机械结构和生物关节,例如机械臂、肘关节、颈关节等。
1)构造器:
| 构造器 | 含义 |
|---|---|
| btGeneric6DofConstraint(btRigidBody rbA,btRigidBody rbB,btTransform frameInA,btTransform frameInB,boolean useLinearReferenceFrameA) | - 含义:创建一个六自由度约束,连接两个刚体。 |
-
参数:
rbA和rbB:需要连接的两个刚体。frameInA和frameInB:分别表示在刚体rbA和rbB的局部坐标系中,约束点的位置和方向(通过变换矩阵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 轴) |