功能模块 LinearMath

功能模块 LinearMath

功能模块 LinearMath

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

对存贮数据序列化操作。

Date: [2018-10-26 Fri 20:00]

Author: fhln

Created: 2018-11-06 Tue 12:14

Validate

posted @ 2018-10-26 22:27  fhln  阅读(670)  评论(0编辑  收藏  举报