美文网首页
基于弹力的力网

基于弹力的力网

作者: 昵称好多想不出来 | 来源:发表于2019-12-30 18:02 被阅读0次

第二章内容:模拟各种力
昨天折腾游戏,体积光部分,具体方法是要用微积分计算光源到某一点的光强,以及该点光折射入人眼的光强和吸收光强,一系列物理公式。
后有一人评论:当前各大厂的口号就是基于物理渲染。
模拟世界各种力往往可以获得 很逼真很眼花缭乱的效果。
比如我们接下来的例子:基于弹力的力网

QQ截图20191230134210.png

最开始没有这个想法的,就是写文章的时候全改了。
原理很简单,想象粒子两两间存在一个弹簧,弹力公式:
F=-k*x
因此x取两个粒子间距离

 PVector force = PVector.sub(position, m.position);             // Calculate direction of force

    float distance = force.mag();                                 // Distance between objects

    distance = constrain(distance, 2,5);                             // Limiting the distance to eliminate "extreme" results for very close or very far objects

力的计算:

loat strength =0.001*distance; //弹性系数要取到好小鸭

效果如下:

代码如下:

Mover[] movers = new Mover[20];
Mover controller;


float g = 0.4;



void setup() {

  size(640,360);

  for (int i = 0; i < movers.length; i++) {

    movers[i] = new Mover(random(0.1,2),random(width),random(height)); 

  }
  
  controller=new Mover(5,0,0);
  

}



void draw() {

  background(255);

  controller.position=new PVector (mouseX,mouseY);
  //controller.display();


  for (int i = 0; i < movers.length; i++) {

    for (int j = 0; j < movers.length; j++) {

      if (i != j) {

        PVector force = movers[j].repluse(movers[i]);

        movers[i].applyForce(force);
        if(i<j)
        line(movers[i].position.x,movers[i].position.y,movers[j].position.x,movers[j].position.y);

      }

    }

    
    PVector force=controller.attract(movers[i]);
    //movers[i].applyForce(force);
    
    movers[i].update();

    //movers[i].display();

  }



}

相关文章

网友评论

      本文标题:基于弹力的力网

      本文链接:https://www.haomeiwen.com/subject/cjimoctx.html