ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 在Box2D中制作一个涡旋

2019-10-07 08:10:19  阅读:274  来源: 互联网

标签:c objective-c box2d quartz-graphics physics


我试图通过施加力在C / Objective C上的Box2D中制作螺旋涡旋.
我想要意识到的是一个漩涡,它将身体从一个点推出,或吸引它们.
我想我将不得不申请多个部队.

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

我想我必须施加3种力量:
– 从中​​心吸引或排斥身体的冲动.
– 让它在螺旋上横向移动的冲动,但……怎么样?
– 如果冲动对我不起作用,则转动身体本身的扭矩.

解决方法:

我曾经做过一个旋转平台,制作了一个圆形传感器,它通过圆形矢量场给予身体切向速度变化.我使用的圆形矢量场是这样的:

V = (y, -x)

可以在此处找到此向量字段的直观表示:
http://kasadkad.files.wordpress.com/2009/09/derham1.png?w=450&h=427

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

    }

}

这个解决方案有很多变通方法,例如,我不使用冲动并手动改变速度,它对我来说效果更好.另外,我使用常数来计算损耗.

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

我希望这有帮助.

编辑:我只记得,通过平台代码,您还可以确保旋转方向,这对于关节来说是不可能的.

标签:c,objective-c,box2d,quartz-graphics,physics
来源: https://codeday.me/bug/20191007/1865377.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有