Cocos2d-x之物理引擎

举报
yd_221104950 发表于 2020/12/02 23:20:13 2020/12/02
【摘要】 术语 Bodies主体:PhysicsBody持有一个对象的物理属性,包括mass(质量)、position(位置)、rotation(旋转)、velocity(速度)、damping(阻尼)。PhysicsBody对象是形状的主干部分,但它本身并没有形状,直到你附加一个形状到它身上。 Material材料:描述材料的属性 density:密度,用来计算父体的质量...

术语

  • Bodies主体:PhysicsBody持有一个对象的物理属性,包括mass(质量)、position(位置)、rotation(旋转)、velocity(速度)、damping(阻尼)。PhysicsBody对象是形状的主干部分,但它本身并没有形状,直到你附加一个形状到它身上。

  • Material材料:描述材料的属性
    density:密度,用来计算父体的质量属性。
    restitution:恢复,用于使用物体碰撞,它的取值范围是从0到1。0意味着不发生碰撞,1意味着完全碰撞。
    friction:摩擦力,用于使物体沿着彼此滑动更真实。

  • Shapes形状:描述碰撞几何。定义一个主体时可以附加形状上去。当你想定义一个很复杂的形状时,你可以附加很多形状到一个主体上。每个形状都对应一个PhysicsMaterial对象,这个对象包含以下这些属性:
    type(类型):形状分类,有circle、box、polygon等
    area(区域):用于计算主体的质量属性,通过density和area计算出质量。
    mass(质量):物质的质量。
    moment(时刻):决定期望的角加速度所需的扭矩。
    offset(偏离):在本地坐标系中,主体的重力中心的偏离量
    tag(标签):可以让开发者更容易识别形状。就是说可以给形状打标记。

  • shapes形状:有以下这些
    PhysicsShape
    PhysicsShapeCircle
    PhysicsShapePolygon
    PhysicsShapeBox
    PhysicsShapeEdgeSegment
    PhysicsShapeEdgePolygon
    PhysicsShapeEdgeBox
    PhysicsShapeEdgeChain

  • Contacts/Joints联系/连接:Contacts和Joints对象描述了主体如何附加到彼此上。

  • World世界:World世界容器就是你的物理主体要添加到的地方和它们被模拟的地方,你可添加主体bodies、shapes形状、constraint限速到world世界中,然后,可以将world作为一个整体更新。world控制着所有项之间的互相作用。与物理API的大部分交互将与PhysicsWorld对象进行。

PhysicsWorld与PhysicsBody

PhysicsWorld
PhysicsWorld对象被用来模拟现实世界。PhysicsWorld深度集成在Scene场景这个层次。
创建一个Scene场景包含一个PhysicsWorld对象,只需要调用initWithPhysics():

if( !Scene::initWithPhysics() )
{

}

  
 
  • 1
  • 2
  • 3
  • 4

每个PhysicsWorld对象都有一些属性与之关联:

  • gravity(重力): 全球重力应用到world,默认是Vec2(0.0f, -98.0f)。
  • speed(速度): 设置物理世界的速度,它是模拟执行的频率,默认是1.0。
  • updateRate(更新频率): 设置物理世界的更新频率。更新频率是EngineUpdateTimes/PhysicsWorldUpdateTimes的值。
  • substeps(子步): 在物理世界的更新设置分步数量。

更新物理世界的过程称为步进。 默认情况下,PhysicsWorld会随时间自动更新。 这叫做自动步进。可以关闭自动步进,通过调用setAutoStep(false)。关闭了自动步进后,你就要手动设置步进,可以通过调用step(time)来完成。Substeps被用于使用比单个帧更精确的时间增量将物理世界向前推进多次。 这允许对步进过程进行更精细的控制,包括更多的流体运动。

PhysicsBody
PhysicsBody对象有position(位置)和velocity(速度)。你可以将forces(外力)、movement(动作)、 damping(阻尼) 、 impulses (推动)应用到PhysicsBody对象上。
PhysicsBody对象可以是静态的,也可以是动态的。动态的可以被用户手动移动,而静态的则不动。Node(节点)提供了setPhysicsBody()方法用来关联一个PhysicsBody对象到节点对象上。

auto visibleSize = Director::getInstance()->getVisibleSize();
s_centre = Vec2(visibleSize.width/2, visibleSize.height/2);

auto physicsBody = PhysicsBody::createBox(Size(65.0f, 81.0f), PhysicsMaterial(0.1f, 1.0f, 0.0f));
physicsBody->setDynamic(false);

//create a sprite
auto sprite = Sprite::create("whiteSprite.png");
sprite->setPosition(s_centre);
addChild(sprite);

//apply physicsBody to the sprite
sprite->addComponent(physicsBody);

//add five dynamic bodies
for (int i = 0; i < 5; ++i)
{ physicsBody = PhysicsBody::createBox(Size(65.0f, 81.0f), PhysicsMaterial(0.1f, 1.0f, 0.0f)); //set the body isn't affected by the physics world's gravitational force physicsBody->setGravityEnable(false); //set initial velocity of physicsBody physicsBody->setVelocity(Vec2(cocos2d::random(-500,500), cocos2d::random(-500,500))); physicsBody->setTag(10); sprite = Sprite::create("blueSprite.png"); sprite->setPosition(Vec2(s_centre.x + cocos2d::random(-300,300), s_centre.y + cocos2d::random(-300,300))); sprite->addComponent(physicsBody); addChild(sprite);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/104766748

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。