Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Box2D中制造漩涡 我试图通过施加力在BX2D上在C++/客观C上产生螺旋涡。 我想了解的是一个漩涡,它将物体从一个点推到另一个点,或者吸引它们。 我想我必须施加不止一个力_C++_Objective C_Box2d_Physics_Quartz Graphics - Fatal编程技术网

在Box2D中制造漩涡 我试图通过施加力在BX2D上在C++/客观C上产生螺旋涡。 我想了解的是一个漩涡,它将物体从一个点推到另一个点,或者吸引它们。 我想我必须施加不止一个力

在Box2D中制造漩涡 我试图通过施加力在BX2D上在C++/客观C上产生螺旋涡。 我想了解的是一个漩涡,它将物体从一个点推到另一个点,或者吸引它们。 我想我必须施加不止一个力,c++,objective-c,box2d,physics,quartz-graphics,C++,Objective C,Box2d,Physics,Quartz Graphics,我的切入点是: 我想我必须施加三种力: -从中心吸引或排斥身体的冲动。 -一种让它在螺旋上横向移动的冲动,但是。。。怎样? -如果冲动对我不起作用的话,转动身体的力矩 我曾经做过一个旋转平台,通过制作一个圆形传感器,将切向速度变化应用到由圆形向量场给出的物体上。我使用的圆形向量场是: V = (y, -x) 该向量场的可视表示可在此处找到: y和x是车身相对于传感器中心的相对位置,因此可以执行如下操作: Vector getTangentVector(Vector relativePosit

我的切入点是:

我想我必须施加三种力: -从中心吸引或排斥身体的冲动。 -一种让它在螺旋上横向移动的冲动,但是。。。怎样?
-如果冲动对我不起作用的话,转动身体的力矩

我曾经做过一个旋转平台,通过制作一个圆形传感器,将切向速度变化应用到由圆形向量场给出的物体上。我使用的圆形向量场是:

V = (y, -x)
该向量场的可视表示可在此处找到:

y和x是车身相对于传感器中心的相对位置,因此可以执行如下操作:

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()));

    }

}
然后,在我的程序的更新方法上,我执行如下操作:

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()));

    }

}
这个解决方案有很多变通方法,例如,我不使用脉冲和手动改变速度,对我来说效果更好。此外,我使用一个常数来解释损耗

尽管如此,它还是产生了我所需要的效果,所以我希望它对你有用。对于漩涡,我想你只需要连接一个关节,比如鼠标关节,连接到中心并抓住身体。如果你只使用关节,它将很难使它强大到足以抓住身体,但弱到足以使它围绕中心旋转。与我的代码一起,通过使用常量可能更容易实现这一点

我希望这有帮助


编辑:我刚刚记得,使用平台代码,您还可以确保旋转方向,而仅使用关节是不可能的。

我创建了一系列围绕中心点旋转的小行星,方法是对每个小行星使用距离关节,然后应用切向力使它们围绕中心“旋转”

可以使用指向漩涡中心的实际力替换距离关节。您还可以缓慢减小距离关节中的距离,以使项目“螺旋”进入。我要用这个,因为它可以让你更好地控制物品进入漩涡的速度

我把“我的身体”称为漩涡中心的身体

从Box2d手册:

b2DistanceJointDef jointDef;
jointDef.Initialize(myBodyA, myBodyB, worldAnchorOnBodyA, worldAnchorOnBodyB); jointDef.collideConnected = true;
world->CreateJoint(&jointDef);
你必须对你的身体施加一些力(比如说它是myBodyB),让它朝着正确的方向移动,这样它就会绕着myBodyA旋转。这需要一些数学知识

您要做的是计算垂直于从myBodyB指向myBodyA的向量的向量。您可以通过查找从myBodyB到myBodyA的向量,对其进行规格化,获取其倾斜度(旋转PI/2),然后将其用作力方向来实现这一点。比如:

// Calculate Tangent Vector
b2Vec2 radius = myBodyB.GetPosition()-myBodyA.GetPosition();
b2Vec2 tangent = radius.Skew();
tangent.Normalize();

// Apply some force along tangent
myBodyB.ApplyForceToCenter(body->GetMass()*acceleration*vTangent);
如果你读对了,你可以看到F=m*a*切向向量;也就是说,在切线方向上施加力。我相信它会顺时针旋转(如果我计算正确的话)。不管怎样,力的负值将使其向相反方向移动

要停止车斗旋转,可以在车斗上使用SetLinearDamping(阻尼值)。所以只要你用力,它就会继续旋转。如果停止施力,应轻轻停止。您可以通过加速度值和阻尼值参数控制加速/减速

如果你真的想很好地控制速度,我相信你可以这样做来控制速度:

b2Vec2 linVel = myBodyB.GetLinearVelocity();
linVel.Normalize();
linVel *= maxSpeed;
myBodyB.SetLinearVelocity(linVel);

这有帮助吗?

我在这里找到了这个BOX2D vortex教程:。这里有一个工作漩涡的例子:谢谢,这是一个很好的灵感(我正在考虑传感器的方式)。但是问题的移动部分没有被解释,对我来说似乎很棘手。flash示例运行得很好,但是。。。没有源代码!非常感谢。谢谢!你的方法很有启发性。到现在为止,我通过使用一个公式(相对于物体与中心点的距离)施加力,使物体沿着螺旋移动。我想找到的是让它们向心运动而不是离心运动的方法。我将在电脑上发布代码(现在在iPhone上)。我想你可以得到从中心到身体的向量,将其归一化,乘以某个常数,然后将其添加到我代码中的速度向量中,它应该会产生你想要的效果。