功能模块 LinearMath
功能模块 LinearMath
Table of Contents
btScalar
针对各系统平台的优化代码。
宏定义
- BT_MANAGED_CODE
托管代码,对齐的结构不支持 managed code. - BT_BULLET_VERSION
版本号,287 - DEBUG 和_DEBUG
定义 BT_DEBUG - BT_USE_DOUBLE_PRECISION
单双精度切换 - BT_LARGE_FLOAT
最大的浮点数 - BT_DECLARE_ALIGNED_ALLOCATOR
一系列分配释放内存的宏定义 - USE_APPROXIMATION
使用 magic function 做开根号之类的近似运算 常数
#define SIMD_PI btScalar(3.1415926535897932384626433832795029) #define SIMD_2_PI (btScalar(2.0) * SIMD_PI) #define SIMD_HALF_PI (SIMD_PI * btScalar(0.5)) #define SIMD_RADS_PER_DEG (SIMD_2_PI / btScalar(360.0)) #define SIMD_DEGS_PER_RAD (btScalar(360.0) / SIMD_2_PI) #define SIMDSQRT12 btScalar(0.7071067811865475244008443621048490) #define btRecipSqrt(x) ((btScalar)(btScalar(1.0) / btSqrt(btScalar(x)))) //倒开根数 #define btRecip(x) (btScalar(1.0) / btScalar(x))
类型
- btScalar
指定精度的浮点数。
函数
btScalar btSqrt(btScalar y); btScalar btFabs(btScalar x); btScalar btCos(btScalar x); btScalar btSin(btScalar x); btScalar btTan(btScalar x); btScalar btAcos(btScalar x); btScalar btAsin(btScalar x); btScalar btAtan(btScalar x); btScalar btAtan2(btScalar x, btScalar y); btScalar btExp(btScalar x); btScalar btLog(btScalar x); btScalar btPow(btScalar x, btScalar y); btScalar btFmod(btScalar x, btScalar y); btScalar btAtan2Fast(btScalar y, btScalar x); //https://blog.csdn.net/lien0906/article/details/49587759 btScalar btNormalizeAngle(btScalar angleInRadians);//限制范围为[-pi,pi]之间
btMinMax 文件
主要比较和设置极大极小值。
const T& btMin(const T& a, const T& b); const T& btMax(const T& a, const T& b); const T& btClamped(const T& a, const T& lb, const T& ub); //限制 a 的范围不超过 lb 和 ub //以及相应 set 函数
btAlignedAllocator
自定义的内存分配器。 之后可能再重写_aligned_malloc 和_aligned_free,使得其更加通用可控。
宏定义
- BT_DEBUG_MEMORY_ALLOCATIONS
可以在编译时定义,来测试内容泄露
函数
void* btAlignedAlloc(size_t size, int alignment); //按照对齐量分配空间 void btAlignedFree(void* ptr);//按照对齐量释放空间。 void btAlignedAllocSetCustom(btAllocFunc *allocFunc, btFreeFunc *freeFunc);//能够让 bullet 所有的内容分配器都通过 custom memory allocator void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc);//如果开发者已经有一个 custom aligned allocator,用这个函数。默认的分配器使用非对 齐方式来分配额外内存。
类
class btAlignedAllocator //对齐分配器的接口类。分配器可以由自定义的 allocator 重写,使用 btAlignedAllocSetCustom 和 btAlignedAllocSetCustomAligned。 { pointer address(reference ref) const; const_pointer address (const_reference ref) const; pointer allocate (size_type n, const_pointer*hint = 0); void construct ( pointer ptr, const value_type & value); void deallocate( pointer ptr ); void destroy ( pointer ptr ); self_type & operator=... bool operator==... }
特殊说明
//定义句柄,其中##是连字符(预处理运算符), //表示将前后字符串(至少有一个是待定的,否则没必要使用)拼接起来。 //而下划线__并无意义,只是为了防止重名作为字符串接在待定字符串 name 后面 //https://blog.csdn.net/u014078216/article/details/24401421 #define BT_DECLARE_HANDLE(name) \ typedef struct name##__ \ { \ int unused; \ } * name
btAlignedObjectArray
宏定义
- BT_USE_PLACEMENT_NEW
定义的时候,支持虚函数 和non-trivial构造函数,用来提高效率,默认启用。 - BT_USE_MEMCPY
定义的时候,交换 array 中元素的话,会使用 memcpy 而不是 operator=,默认禁用。 - BT_ALLOW_ARRAY_COPY_OPERATOR
深拷贝.
btAlignedObjectArray 类
使用 stl::vector 中的子集,用来代替 stl::vector,避免内存对齐问题。自己实现了一部分 vector 的功能。
operator=(const btAlignedObjectArray<T> &other); operator[](int n); void clear(); void pop_back(); void push_back(const T& _Val); void quickSort(const L& CompareFunc); void heapSort(const L& CompareFunc); int findBinarySearch(const T& key) const; //查找不到返回 size int findLinearSearch(const T& key) const; //查找不到返回 size int findLinearSearch2(const T& key) const; //查找不到返回-1
btList
btGEN_Link 类
双向链接,可以检索当前位置前后项。
void insertBefore(btGEN_Link *link); void insertAfter(btGEN_Link *link);
btGEN_List 类
btGEN_Link *getHead() const; btGEN_Link *getTail() const; void addHead(btGEN_Link *link); void addTail(btGEN_Link *link);
btQuickprof
应用于性能分析。
btClock
基本的定时器,检测准确时间,用于性能分析。
void reset(); unsigned long long int getTimeMilliseconds(); unsigned long long int getTimeMicroseconds(); unsigned long long int getTimeNanoseconds(); btScalar getTimeSeconds();
CProfileNode
Profile Hierarchy Tree 的结点。
CProfileIterator
树的迭代器。
CProfileManager
The Manager for the Profile system
CProfileSample
profile a function's scope
btQuadWord
btVector3 和 btQuaternion 的基类。考虑各个平台的兼容性和内存对齐问题.
btScalar& getX() const; btScalar& getY() const; btScalar& getZ() const; void setX(btScalar _x); operator btScalar *(); bool operator==(const btQuadWord& other); bool operator!=(const btQuadWord& other) const;
btVector3
表示 3D 位置和向量。为了对齐和 SIMD,定义了第四个分量 w。
btQuaternion
四元数。
宏定义
- BT_EULER_DEFAULT_ZYX
欧拉角默认 ZYX,未定义。
btQuaternion 类
包含四元数,跟 YXZ 欧拉角、ZYX 欧拉角相互转换的代码。
btQuaternion(const btScalar& _x, const btScalar& _y, const btScalar& _z, const btScalar& _w); btQuaternion(const btVector3& _axis, const btScalar& _angle); btQuaternion(const btScalar& yaw, const btScalar& pitch, const btScalar& roll); void setRotation(const btVector3& axis, const btScalar& _angle); //轴角 void setEuler(const btScalar& yaw, const btScalar& pitch, const btScalar& roll); //转 YXZ 欧拉角 void setEulerZYX(const btScalar& yawZ, const btScalar& pitchY, const btScalar& rollX); //转 ZYX 欧拉角 void getEulerZYX(btScalar& yawZ, btScalar& pitchY, btScalar& rollX) const; btQuaternion& operator*=(const btQuaternion& q); //四元数乘法 btScalar dot(const btQuaternion& q) const; //对应元素相乘 btScalar length2() const; btScalar length() const; btQuaternion normalized() const; //返回正则化之后的版本 btScalar angle(const btQuaternion& q) const; //返回相对另外一个四元数 q 的轴角的半角 btScalar angleShortestPath(const btQuaternion& q) const; //相对另外一个姿态的最小选择角度 btVector3 getAxis() const; btQuaternion inverse() const; btQuaternion slerp(const btQuaternion& q, const btScalar& t) const; //球面线性插值. https://blog.csdn.net/u012947821/article/details/17136443 static const btQuaternion& getIdentity(); //得到单位四元数 btVector3 quatRotate(const btQuaternion& rotation, const btVector3& v); //空间矢量旋转变换,这里用的是公式 v'=q*v*q^-1,其实用 orge 中的算法更高效 https://blog.csdn.net/loiecarsers/article/details/48546871 btQuaternion shortestArcQuat(const btVector3& v0, const btVector3& v1);//找出空间向量旋转的四元数变换 https://blog.csdn.net/shenshikexmu/article/details/70991286 //四元数乘法、求逆、乘向量等运算
注意点
btQuaternion operator*(const btQuaternion& q, const btVector3& w); btQuaternion operator*(const btVector3& w, const btQuaternion& q); //四元数和空间矢量相乘,实际上先把空间向量改写成(x,y,z,0)这种四元数格式,再用四元数乘法。
btHashMap
btHashString
基本的 hash 字符串实现
btHashInt
int 类型的哈希
btHashPtr
btHashKeyPtr
btHashKey
跟 btHashKeyPtr 一样??
btHashMap
实现了泛型哈希表,关于其使用可以参见 Demos\BasicDemo\main.cpp.
函数
void insert(const Key& key, const Value& value); void remove(const Key& key); Value* getAtIndex(int index); Key getKeyAtIndex(int index); Value* operator[](const Key& key); Value* find(const Key& key); int findIndex(const Key& key) const; void clear();
btTransform
btTransform 类实现了非变形的刚性平移旋转变换,旋转矩阵、四元数都支持。
void setFromOpenGLMatrix(const btScalar *m); //4x4 的齐次变换矩阵 btTransform inverseTimes(const btTransform& t) const; //this.inverse() * the other struct btTransformFloatData { btMatrix3x3FloatData m_basis; btVector3FloatData m_origin; }; struct btTransformDoubleData { btMatrix3x3DoubleData m_basis; btVector3DoubleData m_origin; };
btTransformUtil
btTransformUtil 类
用于暂时的变换。
static void integrateTransform(const btTransform& curTrans,const btVector3& linvel,const btVector3& angvel,btScalar timeStep,btTransform& predictedTransform);//tf 积分变换,此次使用了"Practical Parameterization of Rotations Using the Exponential Map"中的算法 static void calculateVelocityQuaternion(const btVector3& pos0,const btVector3& pos1,const btQuaternion& orn0,const btQuaternion& orn1,btScalar timeStep,btVector3& linVel,btVector3& angVel);//根据短时坐标变换计算速度、角速度 static void calculateVelocity(const btTransform& transform0,const btTransform& transform1,btScalar timeStep,btVector3& linVel,btVector3& angVel);//功能同上 static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0,const btQuaternion& orn1a,btVector3& axis,btScalar& angle); //已知两个四元数计算轴角
btConvexSeparatingDistanceUtil 类
btMotionState
接口类,用于动态仿真中与图形渲染的同步和插值。 通常只有移动的物体才被同步(setWorldPosition/setWorldOrientation).
virtual void getWorldTransform(btTransform& worldTrans ) const =0; virtual void setWorldTransform(const btTransform& worldTrans)=0;
btDefaultMotion
btDefaultMotionState 类提供了一个世界坐标系变换的同步操作。
static void integrateTransform(const btTransform& curTrans,const btVector3& linvel,const btVector3& angvel,btScalar timeStep,btTransform& predictedTransform);//旋转积分变换 virtual void getWorldTransform(btTransform& centerOfMassWorldTrans ) const;//synchronizes world transform from user to physics virtual void setWorldTransform(const btTransform& centerOfMassWorldTrans); //synchronizes world transform from physics to user
btMatrix
btVectorX
void resize(int rows); T nrm2() const; //http://cali2.unilim.fr/intel-xe/mkl/mklman/GUID-7E687245-60A6-49EE-B989-4A37C8C20599.htm 貌似跟空间距离的度量和存贮有关 T* getBufferPointerWritable();
btMatrixX
m_rows,m_cols 的矩阵。
void addElem(int row,int col, T val); void setElem(int row,int col, T val); void mulElem(int row,int col, T val); void setIdentity(); //必须是方阵。单元矩阵 void printMatrix(const char* msg); btMatrixX transpose() const; //转置 void rowComputeNonZeroElements() const; //将非零元素存贮到一个 vector 中。 btMatrixX operator*(const btMatrixX& other); //暴力求解相乘矩阵 void setSubMatrix(int rowstart,int colstart,int rowend,int colend,const T value); void setSubMatrix(int rowstart,int colstart,int rowend,int colend,const btMatrixX& block); typedef btMatrixX<float> btMatrixXf; typedef btVectorX<float> btVectorXf; typedef btMatrixX<double> btMatrixXd; typedef btVectorX<double> btVectorXd;
btMatrix3x3
实现了 3x3 旋转矩阵,跟 btQuaternion, btTransform and btVector3 一起使用。
btVector3 getColumn(int i) const; //返回第 i+1 列 const btVector3& getRow(int i) const; btMatrix3x3& operator*=(const btMatrix3x3& m); void setRotation(const btQuaternion& q); void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll); void getRotation(btQuaternion& q) const; void getEulerYPR(btScalar& yaw, btScalar& pitch, btScalar& roll) const; btScalar determinant() const; //行列式 btMatrix3x3 adjoint() const;//伴随阵 btMatrix3x3 transpose() const; btMatrix3x3 inverse() const; btVector3 solve33(const btVector3& b) const; //Solve A * x = b, where b is a column vector void extractRotation(btQuaternion &q,btScalar tolerance = 1.0e-9, int maxIter=100);//A robust method to extract the rotational part of deformations void diagonalize(btMatrix3x3& rot, btScalar tolerance = 1.0e-9, int maxIter=100); //old_this = rot * new_this * rot^T. new_this 是对角阵 btScalar cofac(int r1, int c1, int r2, int c2) const; //余子式
btSerializer
对存贮数据序列化操作。