第二章內(nèi)容:模擬各種力
昨天折騰游戲述寡,體積光部分铐尚,具體方法是要用微積分計(jì)算光源到某一點(diǎn)的光強(qiáng),以及該點(diǎn)光折射入人眼的光強(qiáng)和吸收光強(qiáng)或衡,一系列物理公式焦影。
后有一人評(píng)論:當(dāng)前各大廠的口號(hào)就是基于物理渲染。
模擬世界各種力往往可以獲得 很逼真很眼花繚亂的效果封断。
比如我們接下來的例子:基于彈力的力網(wǎng)
最開始沒有這個(gè)想法的斯辰,就是寫文章的時(shí)候全改了。
原理很簡(jiǎn)單坡疼,想象粒子兩兩間存在一個(gè)彈簧彬呻,彈力公式:
F=-k*x
因此x取兩個(gè)粒子間距離
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
力的計(jì)算:
loat strength =0.001*distance; //彈性系數(shù)要取到好小鴨
效果如下:
代碼如下:
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();
}
}