cocos2d-x节点(b2Distance.h)API
2013-11-29 10:42
453 查看
本文来自http://blog.csdn.net/runaying ,引用必须注明出处!
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
在Box2d最终调用b2Ditance方法来求得两个形状最近点之间的距离,主要用于形状的碰撞检测。使用此方法需要将两个形状转换成一个b2DistanceProxy。为了提供高内部调用的效率,在外部开始调用b2Distance方法时,内部做了一个缓冲,用来提高计算距离的效率。
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
相关文章推荐
- cocos2d-x节点(b2TimeStep.h)API
- cocos2d-x节点(b2Draw.h)API
- cocos2d-x节点(b2Rope.h)API
- cocos2d-x节点(b2Island.h)API
- cocos2d-x节点(b2Fixture.h)API
- cocos2d-x节点(b2GrowableStack.h)API
- cocos2d-x节点(b2Body.h)API
- cocos2d-x节点(b2RevoluteJoint.h)API
- cocos2d-x节点(b2Body.h)API
- cocos2d-x节点(b2WeldJoint.h)API
- cocos2d-x节点(b2Collision.h)API
- cocos2d-x节点(b2Joint.h)API
- cocos2d-x节点(b2Contact.h)API
- cocos2d-x节点(b2EdgeShape.h)API
- cocos2d-X 节点(CCSprite.h)API
- cocos2d-X 节点(CCTextFieldTTF.h)API
- cocos2d-X 节点(CCArmatureAnimation.h)API
- cocos2d-X 节点(UILayer.h)API
- cocos2d-X 节点(UITextField.h)API
- cocos2d-x节点(CCTextureAtlas.h)API