• 全国 [切换]
  • 二维码
    错改网

    手机WAP版

    手机也能找商机,信息同步6大终端平台!

    微信小程序

    微信公众号

    当前位置: 首页 » 行业新闻 » 热点新闻 » 正文

    toxiclibs中的粒子和弹簧

    放大字体  缩小字体 发布日期:2020-01-08 14:50:42   浏览次数:1211  发布人:d8ab****  IP:120.230.82.***  评论:0
    导读

    书名:代码本色:用编程模拟自然系统 作者:Daniel Shiffman 译者:周晗彬 ISBN:978-7-115-36947-5 目录5.16 toxiclibs中的粒子和弹簧1、粒子在Box2D的例子中,我们创建了自己的类(比如Particle类),并在其中加入了一个Box2D物体对象变量。class Particle {Body body;这样的实现方式显得有些多余,因为Box2D在内部维

    书名:代码本色:用编程模拟自然系统
    作者:Daniel Shiffman
    译者:周晗彬
    ISBN:978-7-115-36947-5
    目录

    5.16 toxiclibs中的粒子和弹簧

    1、粒子

    • 在Box2D的例子中,我们创建了自己的类(比如Particle类),并在其中加入了一个Box2D物体对象变量。

    class Particle { Body body;

    • 这样的实现方式显得有些多余,因为Box2D在内部维护了所有物体对象。但是,这种写法允许我们直接获取物体对象的某些信息(继而得到物体的绘制方式),而不需要遍历Box2D内部的对象列表。
    • 让我们看看如何将同样的方法作用在toxiclibs的VerletParticle2D类中。为了方便地绘制粒子对象,并在粒子中加入某些自定义属性,我们还是要定义自己的Particle类。代码如下所示:

    class Particle { VerletParticle2D p; 粒子对象有一个指向VerletParticle对象的引用 Particle(Vec2D pos) { p = new VerletParticle2D(pos); VerletParticle对象需要一个初始位置(x坐标和y坐标) } void display() { fill(0,150); stroke(0); ellipse(p.x,p.y,16,16); 当我们在绘制粒子时,需要向VerletParticle对象询问x坐标和y坐} }

    • 从上面的代码可以看出,绘制粒子是一件很简单的事,可以直接使
      用VerletParticle2D对象的x坐标和y坐标,不需要烦琐的坐标转换,因为toxiclibs用的就是像素坐标。
    • 除此之外,你还会发现这个粒子类只有一个作用,那就是存放VerletParticle2D对象的引用。请回顾第4章讨论的继承特性:这也是一个粒子系统,除了存放VerletParticle2D对象的引用,粒子对象还有什么其他特性?我们是否可以让Particle类继承VerletParticle2D类?

    class Particle extends VerletParticle2D { Particle(Vec2D loc) { super(loc); 调用super()函数,确保对象以正确的方式初始化 } void display() { 我们只需要实现一个display()函数 fill(175); stroke(0); ellipse(x,y,16,16); 从VerletParticle类中继承了x坐标和y坐标 } }

    • 还记得Box2D示例程序的处理步骤吗?我们需要向Box2D物体对象询问它的位置,再将坐标转换为像素坐标,最后根据转换后的坐标绘图。在这里,由于我们从VerletParticle2D类中继承了所有功能,剩下的任务只是根据x坐标和y坐标处绘制图形!
      顺便再提一点,VerletParticle2D类是Vec2D的子类,因此除了从VerletParticle2D继承的特性,我们的粒子类还有Vec2D对象的所有功能。现在,我们可以在Sketch的任意位置创建粒子对象。

    Particle p1 = new Particle(new Vec2D(100,20)); Particle p2 = new Particle(new Vec2D(100,180));

    • 仅仅创建一个粒子是不够的,还应该用addParticle()函数将粒子对象添加到物理世界中。

    physics.addParticle(p1); physics.addParticle(p2);

    • 从toxiclibs的文档中可以看到,addParticle()函数的参数是一个VerletParticle2D对象。

    addParticle(VerletParticle2D particle);

    • 如何在addParticle()函数中传入自己的粒子对象?面向对象编程中有多态特性,由于Particle类继承自VerletParticle2D类,我们可以把这个粒子实例当作两种对象——Particle对象和VerletParticle2D对象。这是面向对象编程中一个很强大的特性。如果自定义类都继承自toxiclibs的类,它们就可以直接将其用在toxiclibs物理库中。

    2、弹簧

      除了VerletParticle类,toxiclibs还提供了一些连接粒子的弹簧类。toxiclibs有3种类型的弹簧。

    • VerletSpring 
      该类在两个粒子之间创建连接,包括刚性连接和弹性连接。其
      中的某个粒子可以被固定,只有弹簧的另一端可以移动。
    • VerletConstrainedSpring 
      可以通过VerletConstrainedSpring对象限
      制连接的最大长度,这样弹性系统具有较好的稳定性。
    • VerletMinDistanceSpring 
      VerletMinDistanceSpring对象可以保证物体之间的距离不小于静止长度,如果你想让物体之间保持一定距离,但不关心它们之间的最大距离,可以使用这个类。

      前面提到的继承和多态技术同样适用于弹簧对象的创建,创建一个弹簧对象需要传入两个VerletParticle对象,由于我们的Particle类继承自VerletParticle对象,因此VerletSpring的构造函数也接受粒子对象作为参数。以下代码展示了如何在粒子对象p1和p2之间创建一个弹性连接,该连接有指定的静止长度和弹性强度。

    float len = 80; 弹簧的静止长度 float strength = 0.01; 弹簧的强度 VerletSpring2D spring=new VerletSpring2D(p1,p2,len,strength);

    • 和粒子一样,为了让弹簧成为toxiclibs物理世界的一部分,我们需要在物理世界中添加这个对象。

    physics.addSpring(spring);

    不推荐电脑端访问(用户少)
    请微信扫一扫,查看完整信息(记得微信收藏)
     
    (文/匿名(若涉版权问题请联系我们核实发布者) / 非法信息举报 / 删稿)
    打赏
    免责声明
    • 
    本文为昵称为 d8ab**** 发布的作品,本文仅代表发布者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,发布者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们154208694@qq.com删除,我们积极做(权利人与发布者之间的调停者)中立处理。郑重说明:不 违规举报 视为放弃权利,本站不承担任何责任!
    有个别老鼠屎以营利为目的遇到侵权情况但不联系本站或自己发布违规信息然后直接向本站索取高额赔偿等情况,本站一概以诈骗报警处理,曾经有1例诈骗分子已经绳之以法,本站本着公平公正的原则,若遇 违规举报 我们100%在3个工作日内处理!
    0 条相关评论
     

    (c)2008-现在 cuogai.com All Rights Reserved.