gpt4 book ai didi

c++ - 在 Box2D 中制作一个漩涡

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:19 43 4
gpt4 key购买 nike

我正在尝试通过施加力在 C++/Objective C 的 Box2D 中制作螺旋涡流。我想实现的是一个漩涡,它从一个点插入物体,或者吸引它们。我想我将不得不施加不止一种力量。

我在这个问题上的切入点是:

我认为我必须应用 3 个力:- 从中心吸引或排斥 body 的冲动。- 一种让它横向螺旋移动的冲动,但是......怎么做?- 如果冲动不适合我,则旋转 body 本身的扭矩。

最佳答案

我曾经通过制作一个圆形传感器来制作一个旋转平台,该传感器将切向速度变化应用于圆形 vector 场给定的主体。我使用的圆形 vector 场是这样的:

V = (y, -x)

可以在此处找到此 vector 场的可视化表示: http://kasadkad.files.wordpress.com/2009/09/derham1.png?w=450&h=427

y 和 x 是 body 相对于传感器中心的相对位置,因此您可以这样做:

Vector getTangentVector(Vector relativePosition, bool invert)
{
Vector vec;
if(invert) //if it's cw or ccw
{
vec.setY(relativePosition.x());
vec.setX(-relativePosition.y());
}
else
{
vec.setY(-relativePosition.x());
vec.setX(relativePosition.y());
}
return vec;
}

然后在我的程序的更新方法上我做了这样的事情:

for (b2ContactEdge* ce = platformBody->GetContactList(); ce; ce = ce->next)
{

b2Contact* c = ce->contact;

if(c->IsTouching())
{
const b2Body* bodyA = c->GetFixtureA()->GetBody();
const b2Body* bodyB = c->GetFixtureB()->GetBody();

const b2Body* targetBody = (bodyA == platformBody)?bodyB:bodyA;

Vector speed = getTangentImpulse(
getRelativePosition(platformBody, targetBody),
true);


speed *= CONSTANT; // CONSTANT = 1.8,
// this is to account for the targetBody attrition,
// so it doesn't slip on the platform

Vector currentSpeed;
currentSpeed.setX(targetBody->GetLinearVelocity().x);
currentSpeed.setY(targetBody->GetLinearVelocity().y);



Vector diff = speed - currentSpeed;
diff *= 0.01; //should depend on time, but this worked nicely. It makes the
//body change its linear velocity to be the same as "speed" at a
//0.01 change rate.

currentSpeed += diff;
targetBody->SetLinearVelocity(
b2Vec2(currentSpeed.x(),
currentSpeed.y()));

}

}

此解决方案中有很多解决方法,例如,我不使用脉冲并手动更改速度,它对我来说效果更好。此外,我使用常数来说明损耗。

它仍然产生了我需要的效果,所以我希望它对你有用。对于漩涡,我猜你只需要连接一个关节,比如鼠标关节,连接到中心并捕获 body 。如果只使用关节,很难使它足够强壮以捕获 body ,但又不够弱以使其绕中心旋转。与我的代码一起,仅通过使用常量可能更容易实现这一点。

希望对您有所帮助。

编辑:我只记得,通过平台代码,您还可以确保旋转方向,这仅靠关节是不可能的。

关于c++ - 在 Box2D 中制作一个漩涡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8565637/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com