如何给刚体添加一个范围性的爆破力

如题,我想在刚体点击的时候,它的一定范围内,有爆破力的效果,就像爆炸一样,在此范围内的物体都会被弹开。
有想法的朋友不吝赐教啊!谢谢!

— Begin quote from ____

bailu_1901 发表于 2012-8-25 00:33 url

这个很好实现,我的方法是给这些物体一个冲量,方向是你给定点到该物体质心的向量,冲量大小自己定 …

— End quote

你也是用射线吗?我上面的问题能帮忙回答一下吗?

这个很好实现,我的方法是给这些物体一个冲量,方向是你给定点到该物体质心的向量,冲量大小自己定

— Begin quote from ____

jetion 发表于 2012-8-26 00:10 url

你也是用射线吗?我上面的问题能帮忙回答一下吗?

— End quote

不是射线,射线的方法比较土,用的是aabb query,你给aabb,可以在world里查询这个aabb内body,然后给每个body一个方向为你给定点到该body质心 一个冲量就行了,推荐你看看他源码自带的testbed的事例代码,里面什么都有,这种问题没问题问别人。

为什么问关于Box2D的问题都没人回答?

用光线投射!

不能沉啊,自己顶起

同求,帮顶:)

— Begin quote from ____

super_user_zyc 发表于 2012-8-22 08:12 url

用光线投射!

— End quote

能具体点吗?或者给个代码

这个问题本人目前已有一个解决方法:遍历世界中所有body,算出爆破点和body之间的距离,若距离小于自己设定的爆破半径,则视该body在爆破范围内,根据距离和爆破半径的比例,给于相应大小的冲量,这里我遇到的一个问题就是,我applyForce的时候总是失败,我只能选择使用applyLinearImpulse,蛋疼的菜鸟。。。

— Begin quote from ____

super_user_zyc 发表于 2012-8-23 09:10 url

const float radius = 3.5f;
const float power = 5.0f;

— End quote

太犀利了。弥补了我之前那个方法的一个缺陷:当前面有物品挡住时,按道理应该是不受力的!
几个问题想再请教一下你:

  1. BodyNode 是你自己封装的节点吗?我用CCSprite代替了,不知道你类里面还有没有实现什么。
  2. (callback.m_point.x - center.x)* power / dist * (radius - dist)2.0f; 其中(callback.m_point.x - center.x) / dist 是求出余弦值 ,然后power ,当然,还有受距离比例的影响,越远的受力越小,相乘,就得到速度在x轴方向的分量了,但是按我的分析,如果要这么实现的话。代码应该是这样:
    v.x = ((callback.m_point.x - center.x) / dist) * ((radius - dist) / radius) * power;
    v.y = ((callback.m_point.y - center.y) / dist) * ((radius - dist) / radius) * power;
    所以只要又请教你上面的算法是为了实现什么的?
    3.SetLinearVelocity和ApplyLinearImpulse有什么区别,我用SetLinearVelocity发现了一个现在,好像速度不过质心,也就是说,当受力物体在爆炸物体的正上方是,它并没有像想象中的那样往上飞,而是抛物线的飞出去了,,,不知道我测试的准不准,求指教!

const float radius = 3.5f;
const float power = 5.0f;

RayCastClosestCallback callback;

b2Vec2 center = GetBody()->GetPosition();
b2Vec2 point2;

for(float angle  = 0; angle < b2_pi*2; angle += 0.5f){
	point2.x = radius*cosf(angle) + center.x;
	point2.y = radius*sinf(angle) + center.y;

	callback.m_hit = false;
	GetBody()->GetWorld()->RayCast(&callback, center, point2);

	if(callback.m_hit){
		BodyNode* bodynode = (BodyNode*)(callback.body->GetUserData());

		if(bodynode != NULL){
			float dist = b2Distance(center, callback.m_point);
			b2Vec2 v;

			if(radius - dist > 0){
				v.x = (callback.m_point.x - center.x)* power / dist * (radius - dist)*2.0f;
				v.y = (callback.m_point.y - center.y)* power / dist * (radius - dist)*2.0f;

				callback.body->SetLinearVelocity(v);

			}
		}
	}
}

class RayCastClosestCallback : public b2RayCastCallback
{
public:
RayCastClosestCallback()
{
m_hit = false;
}

float32 ReportFixture(	b2Fixture* fixture, const b2Vec2& point,
	const b2Vec2& normal, float32 fraction)
{
	m_point = point;
	body = fixture->GetBody();
	m_hit = true;

	return fraction;
}

bool m_hit;
b2Vec2 m_point;
b2Body* body;

};