手持终端
Eclipse平台下Android开发环境的搭建
PhoneGap配置到Eclipse开发环境
使用PhoneGap开发Android应用程序
PhoneGap3.0以上版本配置到Eclipse开发环境
使用PhoneGap3.0版本开发Android应用程序
PhoneGap3.0的第三方Android插件
Cordova配置到Android Studio开发环境
Android系统基本架构
Android的字符串颜色图片样式
Android的常用控件及菜单
Android的消息提示及传递
Android系统的组件通信
Android系统的Service
Android的广播消息接收
Android的数据存储与访问
Android系统的网络应用
Android图形图像处理
Android的Fragment框架
Android系统的并发编程
Java源文件结构与保留字
Java语言的数据类型与变量
Java的运算符与流程控制
Java语言的数组及操作
Java面向对象编程
Java的常用类
Android开发常用工具及命令
Android应用程序权限管理
Android系统提供的R类内置资源
Android系统的控件类及其方法
Android系统的菜单类及其方法
Android系统的对话框
Android应用程序模型及组件
Android的绘图类及方法
Android系统的动画效果
Android的数据库操作
Android的多媒体功能
Android系统照相机的使用
Android的文本朗读TTS
获取Android系统信息
Android系统的电话操作
Android系统的定位
Android系统的传感器
JBullet是开源物理引擎Bullet的Java版本,可以直接用于Android,该引擎能根据需要设定重力、密度、摩擦系数和弹性系数等参数,自动进行3D刚体物理运动的全方位模拟。JBullet中有很多常用的类。
一、常用的类:
1.Vector3f类:三维向量类
该类属于javax.vecmath包,继承自同一包下的Tuple3f(三元组)类。该类可以表示速度、点、力等向量。这个类并不是JBullet包中特有的类。
1)构造器:
构造器 |
含义 |
public Vector3f() |
创建一个三维分量初始值都为零的三维向量对象 |
public Vector3f(float[] f) |
由一个长度为3的数组中的元素的值创建三维向量对象 |
public Vector3f(Vector3f v) |
由另一个三维向量对象3个维度的分量值创建新的三维对象 |
public Vector3f(float a,float b,float c) |
由3个浮点数创建一个三维向量对象 |
2)方法:
方法 |
含义 |
public float dot(Vector3f v) |
与另一个三维向量进行点积操作 |
public void cross(Vector3f v1,Vector3f v2) |
将两个三维向量进行叉积操作,结果存放于当前三维向量中 |
public void add(Tuple3f v) |
将两个向量相加 |
public void normalize() |
将向量进行归一化,即方向不变,长度变为1 |
public float length() |
求向量的长度的方法 |
public void set(Tuple3f v) |
设置当前向量的值 |
2. Transform类:变换类
该类属于com.bulletphysics.linearmath包,用来表示刚体的变换,如平移、旋转等。
1)属性:
属性 |
含义 |
public final Matrix3f basic |
表示旋转变换的3x3矩阵 |
public final Matrix3f oriigin |
表示平移变换的向量 |
2)构造器:
构造器 |
含义 |
public Transform() |
无参构造器 |
public Transform(Matrix3f mat) |
参数mat表示传入的3x3矩阵,初始化旋转矩阵 |
public Transform(Matrix4f mat) |
参数mat表示传入的4x4矩阵,初始化旋转或平移矩阵 |
public Transform(Transform tr) |
参数tr表示传入的另一个Transform对象,用tr来初始化 |
3)方法:
方法 |
含义 |
public void Transform(Vector3f v) |
进行平移变换的方法,v表示平移变换对应的向量 |
public void setIdentity() |
将Transform设置为初始状态 |
public void mul(Transform tr) |
将当前变换与另一个变换复合 |
public void mul(Transform tr1,Transform tr2) |
当前变换为另外两个变换复合的结果 |
public void setRotation(Quat4f q) |
设置当前变换的旋转变换数据 |
public Matrix4f getMatrix(Matrix4f out) |
获取当前变换所存储的变换信息 |
3. RigidBody类:刚体类
该类属于com.bulletphysics.dynamics包,继承自CollisionObject类,用于存储刚体的一些属性信息,包括线速度、角速度、摩擦系数等。
1)构造器:
构造器 |
含义 |
public RigidBody(float mass, MothisState motionState, CollisionShape collisionshape) |
创建一个刚体对象,mass为刚体质量,motionState为刚体运动状态对象,collisionshape表示用于碰撞计算的形状 |
2)方法:
方法 |
含义 |
public void setGravity(Vector3f acc) |
设置刚体的重力加速度,acc为重力加速度的值 |
public void setRestitution(float restitution) |
设置弹性系数 |
public void setFriction(float friction) |
设置摩擦系数 |
public MotionState getMotionState() |
获取存储刚体位置、姿态的MotionState对象 |
public void clearForces() |
清除刚体所有的受力 |
public Vector3f getLinearVelocity(Vector3f outt) |
获取刚体的线速度 |
public Vector3f getAngularVelocity(Vector3f outt) |
获取刚体转动的角速度 |
public void setLinearVelocity(Vector3f linvel) |
设置刚体的线速度 |
public void setAngularVelocity(Vector3f angvel) |
设置刚体的角速度 |
4. CollisionShape类:碰撞形状抽象类
该类属于com.bulletphysics.collision.shapes包,是所有碰撞形状具体类的根类。方法有:
方法 |
含义 |
public void getAabb(Transform t, Vector3f aabbMin, Vector3f aabbMax) |
获取AABB包围盒边界参数,t表示要执行的变换,aabbMin表示存储3个最小值的向量,aabbMax表示存储3个最大值的向量 |
public BroadphaseNativeType getShapeType() |
获取当前碰撞形状的类别,返回值为枚举类型,包括BOX_SHAPE_PROXYTYPE、CONE_SHAPE_PROXYTYPE、TRIANGLE_SHAPE_PROXYTYPE、CAPSULE_SHAPE_PROXYTYPE等 |
public boolean inConvex() |
判断当前形状是否为凸面形状 |
public boolean inConcave() |
判断当前形状是否为凹面形状 |
public boolean inCompound() |
判断当前形状是否为复合形状 |
public boolean inPolyhedral() |
判断当前形状是否为多面体 |
public void setLocalScaling(Vector3f scaling) |
设置此形状3个轴方向的缩放比,可用来对形状进行变形操作,参数scaling为3个轴方向的缩放比 |
public abstract Vector3f getLocalScaling(Vector3f out) |
获取此形状3个轴方向的缩放比,参数out为获取的3个轴方向的缩放比 |
public void calculateLocalInertia(float mass, Vector3f inertia) |
计算形状的惯性,参数mass为质量,参数inertia用来保存计算结果 |
5. BoxShape类:长方体盒碰撞形状
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的PolyhedralConvexShape类,间接继承CollisionShape类,可用于盒子、箱子等规则物体。构造器为:
构造器 |
含义 |
public BoxShape(Vector3f boxHalfExtents) |
创建一个长方体盒碰撞形状物体 |
6. StaticPlaneShape类:静态平面形状
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的ConcaveShape类,表示静态的平面,如地面、屋顶等。
1)构造器为:
构造器 |
含义 |
public StaticPlaneShape(Vector3f planeNormal, float planeConstant) |
创建一个静态平面碰撞形状对象,参数planeNormal为平面法向量,planeConstant为平面上任意一点 |
2)方法:
方法 |
含义 |
public Vector3f getPlaneNormal( Vector3f out) |
获取平面法向量,参数out为保存平面法向量的向量 |
7. SphereShape类:球体形状
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的ConvexInternalShape类,表示一个球体。
1)构造器为:
构造器 |
含义 |
public SphereShape(float radius) |
创建一个球体碰撞形状对象,参数radius为球半径 |
2)方法:
方法 |
含义 |
public float getRadius( ) |
获取球的半径 |
8. CylinderShape类:圆柱形状
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的BoxShape类,表示一个圆柱形状,如杆、金币、石柱等都可以采用此类,但碰撞计算量较大,不如胶囊。构造器:
构造器 |
含义 |
public CylinderShape ( Vector3f halfExtents) |
创建一个侧面围绕Y轴的圆柱体碰撞形状对象,参数halfExtents为表示圆柱体的三维分量,第1和3维表示圆柱的长短半径,第2维是长度 |
还有两个CylinderShapeX和CylinderShapeZ类,分别表示质心在原点而包围x轴和z轴的圆柱。
9. CapsuleShape类:胶囊形状
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的ConvexInternalShape类,表示一个胶囊形状,碰撞计算量比圆柱小,旗杆、铅笔等一般使用该类。
1)构造器为:
构造器 |
含义 |
public CapsuleShape(float radius, float height) |
创建一个质心在原点包围Y轴的胶囊碰撞形状对象,参数radius为两端球面的半径,height为中间圆柱的长度 |
2)方法:
方法 |
含义 |
public float getRadius( ) |
获取胶囊截面的半径 |
public float getHalfHeight( ) |
获取中间圆柱部分长度值的一半 |
还有两个CapsuleShapeX和CapsuleShapeZ类,分别表示质心在原点而包围x轴和z轴的胶囊。
10. CompoundShape类:复合形状
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的CollisionShape类,表示一个复合形状。常用方法为:
方法 |
含义 |
public void addChildShape(Transform localTransform, CollisionShape shape) |
向组合形状中添加子形状,localTransform为添加的子形状的原始姿态、位置变换,shape为添加的子形状 |
public void removeChildShape( CollisionShape shape) |
从组合形状中删除指定的子形状 |
public int getNumChildShapes() |
返回当前组合形状中子形状的数量 |
public CollisionShape getChildShape(int index) |
返回组合形状中指定索引编号的子形状 |
public Transform getChildTransform(int index, Transform out) |
返回组合形状中指定索引编号子形状的原始状态、位置变换 |
11. BvhTriangleMeshShape类:层次包围结构三角形组形状
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的TriangleMeshShape类,表示一个由多个三角形组成的立体形状,主要用来表示比较复杂的静态物体,如地形、山岗、建筑物等。构造器:
构造器 |
含义 |
public BvhTriangleMeshShape() |
无参构造器 |
public BvhTriangleMeshShape ( StrdingMeshInterface meshInterface, boolean useQuantizedAabbCompression) |
参数meshInterface为创建形状时需要的三角形组中各个三角形的顶点数据,useQuantizedAabbCompression为是否使用量化的AABB盒压缩 |
public BvhTriangleMeshShape ( StrdingMeshInterface meshInterface, boolean useQuantizedAabbCompression, boolean buildBvh) |
参数buildBvh为是否使用层次包围结构 |
12. GImpactMeshShape类:三角网状形状
该类属于com.bulletphysics.extras.gimpact包,直接继承自该包的GImpactShapeInterface抽象类,而GImpactShapeInterface类则继承自com.bulletphysics.collision.shapes包的ConcaveShape。该类表示由多个三角形组成的立体结构,主要用来表示比较复杂的运动物体,如兔子、圆环、茶壶等。
1)构造器:
构造器 |
含义 |
public GImpactMeshShape(StrdingMeshInterface meshInterface) |
参数meshInterface为创建形状时需要用到的三角形组中各个三角形的顶点数据 |
2)方法:
方法 |
含义 |
public int getMeshPartCount() |
返回此形状组成的部分的数量 |
public GImpactMeshShapePart getMeshPart(int index) |
返回此形状指定索引编号的组成部分 |
13. TriangleIndexVertexArray类:三角形顶点数据数组
该类属于com.bulletphysics.collision.shapes包,直接继承自该包的StridingMeshInterface抽象类,用来封装一个由三角形组成的立方体形状中各个顶点的数据,数据的组织方式采用的是索引法。
1)构造器:
构造器 |
含义 |
public TriangleIndexVertexArray() |
无参构造器 |
public TriangleIndexVertexArray(int numTriangles, ByteBuffer triangleIndexBase, int triangleIndexStride, int numVertices, ByteBuffer vertexBase, int vertexStride) |
numTriangles为三角形个数,triangleIndexBase为索引数据缓冲,triangleIndexStride为索引数据间隔,numVertices为总共的顶点个数,vertexBase为顶点数据缓冲,vertexStride为顶点数据间隔 |
2)方法:
方法 |
含义 |
public void addIndexedMesh ( IndexedMesh mesh) |
向三角形顶点数组中添加顶点数据,参数mesh为封装了要添加的顶点数据的对象,数据采用索引法组织,索引数据必须为整型 |
public void addIndexedMesh ( IndexedMesh mesh, ScalarType indexType) |
向三角形顶点数组中添加顶点数据,参数mesh为封装了要添加的顶点数据的对象,数据采用索引法组织。索引数据可以为FLOAT、DOUBLE、INTEGER、SHORT、FIXEDPOINT88 |
public int getNumSubParts() |
获取三角形组中组成部分的数量,即此三角形组中包含的mesh数 |
二、关节:
JBullet提供了几种关节,主要有铰链关节、滑动关节、六自由度关节、点对点关节等。关节可以看作是刚体之间的约束
1. 铰链关节HingeConstraint:
铰链是仅有一个旋转自由度的关节,通过铰链的约束限制,相关刚体仅能绕铰链轴旋转。
1)构造器:
构造器 |
含义 |
public HingeConstraint(RigidBody rbA, Transform rbAFrame) |
创建添加到刚体上的铰链,参数rbA为要添加约束的刚体,rbAFrame为从约束位置到刚体质心位置的变换 |
public HingeConstraint(RigidBody rbA, RigidBody rbB, Transform rbAFrame, Transform rbBFrame) |
创建添加到刚体上的铰链,参数rbA和rbB为要添加约束的刚体,rbAFrame和rbBFrame为从约束位置到;两个刚体质心位置的变换 |
2)方法:
方法 |
含义 |
public float getHingeAngle() |
获取铰链当前的旋转角度值 |
public void setLimit ( float low, float high) |
设置铰链的转动范围,low为下限值,high为上限值 |
public float getLowerLimit() |
获取转动角度的下限值 |
public float getUpperLimit() |
获取转动角度的上限值 |
public Transform getAFrame(Transform out) |
获取从约束位置到第2个刚体质心位置的变换 |
public Transform getBFrame(Transform out) |
获取从约束位置到第2个刚体质心位置的变换 |
public void enableAngularMotor ( boolean enableMotor, float targetVelocity, float maxMotorImpulse) |
启动马达,enableMotor为是否允许使用马达,targetVelocity为关节角速度,maxMotorImpulse为最大马达驱动力 |
马达用于模拟提供动力的部件。
2. 滑动关节SliderConstraint:
滑动关节是一种仅有平移和旋转自由度的关节,如螺丝和螺母。
1)构造器:
构造器 |
含义 |
public SliderConstraint(RigidBody rbA, RigidBody rbB, Transform frameInA, Transform frameInB, boolean useLinearReferenceFrameA) |
创建滑动关节,rbA和rbB为两个刚体,frameInA和frameInB分别为从约束位置到刚体质心位置的变换,useLinearReferenceFrameA表示两个刚体与两个约束之间的对应关系,为true时rbA对应frameInA,为false时交叉对应 |
2)方法:
方法 |
含义 |
public void setUpperLinLimit ( float upperLimit) |
设置滑动关节滑动距离上限 |
public void setLowerLinLimit ( float lowerLimit) |
设置滑动关节滑动距离下限 |
public float getUpperLinLimit() |
获取滑动距离的上限值 |
public float getLowerLinLimit() |
获取滑动距离的下限值 |
public void setUpperAngLimit ( float upperLimit) |
设置滑动关节转动角度上限 |
public void setLowerAngLimit ( float lowerLimit) |
设置滑动关节转动角度下限 |
public float getUpperAngLimit() |
获取转动角度的上限值 |
public float getLowerAngLimit() |
获取转动角度的下限值 |
public float setDampingDirLin(float dampingDirLin) |
设置关节的滑动阻尼系数 |
public float setDampingDirAng(float dampingDirAng) |
设置关节的转动阻尼系数 |
public float getDampingDirLin() |
获取关节的滑动阻尼系数 |
public float getDampingDirAng() |
获取关节的转动阻尼系数 |
public void setPoweredLinMotor ( boolean onOff) |
设置是否启动滑动对应的马达 |
public void setMaxLinMotorForce (float maxLinMotorForce) |
设置驱动滑动马达的最大力 |
public void setTargetLinMotorVelocity (float targetLinMotorVelocity) |
设置驱动滑动马达的速度 |
public void setPoweredAngMotor ( boolean onOff) |
设置是否启动转动对应的马达 |
public void setMaxAngMotorForce (float maxAngMotorForce) |
设置驱动转动马达的最大力 |
public void setTargetAngMotorVelocity (float targetangMotorVelocity) |
设置驱动转动马达的速度 |
3. 六自由度关节Generic6DofConstraint:
六自由度关节有6个不同的自由度,包括3个平移自由度和3个转动自由度,可以模拟动物关节及机械结构,如肘关节、颈关节、机械手臂等。通过锁死或限制此关节的某个或某几个自由度,可以模拟其他类型的关节。
1)构造器:
构造器 |
含义 |
public Generic6DofConstraint(RigidBody rbA, RigidBody rbB, Transform frameInA, Transform frameInB, boolean useLinearReferenceFrameA) |
创建6自由度关节,rbA和rbB为两个刚体,frameInA和frameInB分别为从约束位置到刚体质心位置的变换,useLinearReferenceFrameA表示两个刚体与两个约束之间的对应关系,为true时rbA对应frameInA,为false时交叉对应 |
2)方法:
方法 |
含义 |
public void setLinearUpperLimit ( Vector3f linearUpper) |
设置关节3个滑动自由度距离的上限 |
public void setLinearLowerLimit ( Vector3f linearLower) |
设置关节3个滑动自由度距离的下限 |
public void seAngularUpperLimit ( Vector3f angularUpper) |
设置关节3个转动自由度距离的上限 |
public void setAngularLowerLimit ( Vector3f angularLower) |
设置关节3个转动自由度距离的下限 |
public float getAngular(int axis_index) |
获取指定轴的旋转角度,基于欧拉角的计算方法 |
public Transform getCalculatedTransformA ( Transform out) |
获取关节连接的第1个刚体在全局坐标系中的变换 |
public Transform getCalculatedTransformB ( Transform out) |
获取关节连接的第2个刚体在全局坐标系中的变换 |
public void setLimit (int axis, float lo, float hi) |
设置指定编号自由度的下限和上限,前3个为滑动自由度,后3个为转动自由度,lo为下限值,hi为上限值 |
4. 点对点关节Point2PointConstraint:
点对点关节仅有3个旋转自由度。
1)构造器:
构造器 |
含义 |
public Point2PointConstraint(RigidBody rbA, Vector3f pivotInA) |
创建点对点约束,pivotInA为关节在此刚体坐标系中的位置 |
public Point2PointConstraint(RigidBody rbA, RigidBody rbB, Vector3f pivotInA, Vector3f pivotInB) |
创建点对点约束,rbA和rbB为两个刚体,pivotInA和pivotInB为关节分别在两个刚体坐标系中的位置 |
2)方法:
方法 |
含义 |
public void setPivotA ( Vector3f pivotA) |
设置关节在第1个刚体坐标系中的位置 |
public void setPivotB ( Vector3f pivotB) |
设置关节在第2个刚体坐标系中的位置 |
public Vector3f getPivotInA ( Vector3f out) |
获取关节在第1个刚体坐标系中的位置 |
public Vector3f getPivotInB ( Vector3f out) |
获取关节在第2个刚体坐标系中的位置 |