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

最开始没有这个想法的,就是写文章的时候全改了。
原理很简单,想象粒子两两间存在一个弹簧,弹力公式:
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();
}
}
网友评论