您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x节点(b2Distance.h)API

2013-11-29 10:42 453 查看
本文来自http://blog.csdn.net/runaying ,引用必须注明出处!


cocos2d-x节点(b2Distance.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

在Box2d最终调用b2Ditance方法来求得两个形状最近点之间的距离,主要用于形状的碰撞检测。使用此方法需要将两个形状转换成一个b2DistanceProxy。为了提供高内部调用的效率,在外部开始调用b2Distance方法时,内部做了一个缓冲,用来提高计算距离的效率。
///cocos2d-x-3.0alpha0/external/Box2D/Collision
//在Box2d最终调用b2Ditance方法来求得两个形状最近点之间的距离,主要用于形状的碰撞检测。使用此方法需要将两个形状转换成一个b2DistanceProxy。为了提供高内部调用的效率,在外部开始调用b2Distance方法时,内部做了一个缓冲,用来提高计算距离的效率。

#ifndef B2_DISTANCE_H
#define B2_DISTANCE_H

#include <Box2D/Common/b2Math.h>
//声明类
class b2Shape;

// 距离代理,使用GJK算法实现
// 它封装了任何形状
struct b2DistanceProxy
{
//    构造函数,初始化信息
b2DistanceProxy() : m_vertices(NULL), m_count(0), m_radius(0.0f) {}
//    用给定的形状初始化代理。当使用代理时,形状必须保持在一定的范围内
//    * 参数说明: shape:形状指针变量
//    index:索引值
void Set(const b2Shape* shape, int32 index);

//    根据指定的方向获得支撑点的索引
//    * 参数说明: d:向量的引用
//    * 返 回 值: 顶点的索引
int32 GetSupport(const b2Vec2& d) const;
//
//    根据指定的方向获得支撑点
//    * 参数说明: d:向量的引用
//    * 返 回 值: 顶点坐标
const b2Vec2& GetSupportVertex(const b2Vec2& d) const;

///获取顶点个数
int32 GetVertexCount() const;

/// 根据索引获得顶点
//    用于b2Distance
const b2Vec2& GetVertex(int32 index) const;
///顶点缓存,用于保存chain形状中的两个顶点
b2Vec2 m_buffer[2];
const b2Vec2* m_vertices;         //坐标点
int32 m_count;                  //顶点的数量
float32 m_radius;         //半径
};
//第一次调用将count置0
///使用它预启动b2Distance
struct b2SimplexCache
{
float32 metric;     //长度或面积
uint16 count;       //顶点数
uint8 indexA[3];    //shapeA上的顶点索引数组
uint8 indexB[3];    //shapeB上的顶点索引数组
};

//  b2Distance的输入
//  在计算中你必须选择使用形状的半径
struct b2DistanceInput
{
b2DistanceProxy proxyA;    //距离代理A
b2DistanceProxy proxyB;    //距离代理B
b2Transform transformA;    //转换A
b2Transform transformB;    //转换B
bool useRadii;             //是否使用半径
};

// b2Distance的输出  -
struct b2DistanceOutput
{
b2Vec2 pointA;        ///< shapeA上最近的点
b2Vec2 pointB;        ///< shapeB上最近的点
float32 distance;   //距离
int32 iterations;    ///< GJK的迭代次数
};

//在两个形状间计算最近点。支持下面的任何组合:
//圆形、多边形、边缘形状。单纯形缓存输入/输出
//第一次调用设置b2SimplexCache.count为0
//* 参数说明: output :距离输出指针
//cache  :单纯形缓存指针
//input  :距离输入指针
void b2Distance(b2DistanceOutput* output,
b2SimplexCache* cache,
const b2DistanceInput* input);

//////////////////////////////////////////////////////////////////////////
//获取顶点个数
inline int32 b2DistanceProxy::GetVertexCount() const
{
return m_count;
}
//根据索引获得顶点
inline const b2Vec2& b2DistanceProxy::GetVertex(int32 index) const
{
b2Assert(0 <= index && index < m_count);
return m_vertices[index];
}
//根据指定的方向获得支撑点索引,用于构建单纯形
inline int32 b2DistanceProxy::GetSupport(const b2Vec2& d) const
{
int32 bestIndex = 0;
// 获取最远的点,用于产生的单纯形包含最大的空间区域
float32 bestValue = b2Dot(m_vertices[0], d);
//遍历所有的顶点,获取最远点的索引
for (int32 i = 1; i < m_count; ++i)
{
float32 value = b2Dot(m_vertices[i], d);
if (value > bestValue)
{
bestIndex = i;
bestValue = value;
}
}
//返回索引
return bestIndex;
}
//根据指定的方向向量获得支撑点,用于构建单纯形
inline const b2Vec2& b2DistanceProxy::GetSupportVertex(const b2Vec2& d) const
{
int32 bestIndex = 0;
float32 bestValue = b2Dot(m_vertices[0], d);
//遍历所有的顶点,获得远的点
for (int32 i = 1; i < m_count; ++i)
{
float32 value = b2Dot(m_vertices[i], d);
if (value > bestValue)
{
bestIndex = i;
bestValue = value;
}
}
//返回顶点
return m_vertices[bestIndex];
}

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: