博文索引目录:
1. 引言
2. 作品
- 2.1 第0章(引言)—— 我对我的梦有种迷恋,就像这漫天星的夜
- 2.2 第1章(向量)—— 心如止水,却为叶所动
- 2.3 第2章(力)—— 樱花飘来的方向,大概就是我思念追随的地方
- 2.4 第3章(振荡)—— 你看那活泼可爱的小蝌蚪,它在找荷叶还是妈妈呢?
- 2.5 第4章(粒子系统)——是彩虹桥呀!
3. 总结
1. 引言
这一次互动媒体技术的作品是利用processing创作五幅模拟随机行为和牛顿运动学的作品。下面将按《代码本色》章节顺序依次展示作品,自然这么美,跟小明一起去看看吧!~
2. 作品
- 2.1 第0章(引言)—— 我对我的梦有种迷恋,就像这漫天星的夜
效果图:
作品规律描述:
1.夜空中的星星闪闪发光,在随着夜幕慢慢向右移动。
2.流星雨从左上角向右下角滑动,速度不同,大小不同,深浅不同,方向也有差异。
原理技术参考:
本作品主要用柏林噪声实现对流星雨位置的平滑过渡,而星星的位置和大小则是伪随机形成的。
代码如下:
//星星
Point[] stars=new Point[50];
float[] txs=new float[50];
float[] tys=new float[50];
//流星雨
Point[] showers=new Point[10];
float[] tsh=new float[10];
float[][] k=new float[10][2];
float[][] off=new float[10][2];
float[] offset=new float[10];
void setup()
{
size(1000,600);
//满屏的星星
//fullScreen();
//星星初始位置
for(int i=0;i<50;i++)
{
stars[i]=new Point();
stars[i].x=random(0,width);
stars[i].y=random(0,height);
//柏林噪声随机时间点
txs[i]=random(0,width);
tys[i]=random(0,height);
}
//流星雨初始位置
for(int i=0;i<10;i++)
{
showers[i]=new Point();
showers[i].x=random(0,width);
showers[i].y=random(0,height);
//柏林噪声随机时间点
tsh[i]=random(0,width);
}
for(int i=0;i<10;i++)
{
off[i][0]=random(0,10000);
off[i][1]=random(0,10000);
}
for(int i=0;i<10;i++)
{
offset[i]=random(0,10000);
}
}
void draw()
{
//运行秒数
int time=millis()/1000;
//每帧刷新背景(夜空)
background(6,35,104);
//星星位置
for(int i=0;i<50;i++)
{
//星星位置平滑增加-》柏林噪声
//看上去像是往右移动
stars[i].x += 0.3*noise(txs[i]);
stars[i].y += 0.07*noise(tys[i]);
txs[i] += 0.005*randomGaussian();
tys[i] += 0.005*randomGaussian();
//如果出屏幕,取余
if(stars[i].x>width)
stars[i].x=stars[i].x%width;
if(stars[i].y>height)
stars[i].y=stars[i].y%height;
}
//画星星,随机造成闪烁效果
fill(255,255,0);
noStroke();
for(int i=0;i<50;i++)
ellipse(stars[i].x,stars[i].y,random(1,5),random(1,5));
//流星雨位置
for(int i=0;i<10;i++)
{
//星星位置平滑增加-》柏林噪声
//看上去像是往右移动
k[i][0]=map(noise(off[i][0]),0,1,6,12);
k[i][1]=map(noise(off[i][1]),0,1,4,10);
showers[i].x += k[i][0]*noise(tsh[i]);
showers[i].y += k[i][1]*noise(tsh[i]);
tsh[i] += 0.01;
off[i][0]+=0.01;
off[i][1]+=0.01;
//如果出屏幕,取余
if(showers[i].x>width)
showers[i].x=showers[i].x%width;
if(showers[i].y>height)
showers[i].y=showers[i].y%height;
}
//画流星雨
fill(255,255,255);
for(int i=0;i<10;i++)
{
float randnum=100*noise(offset[i]);
for(int j=0;j<randnum;j++)
ellipse(showers[i].x+j,showers[i].y+j*( k[i][1]/ k[i][0]),0.1+0.03*j,0.1+0.03*j);
offset[i]+=0.001;
}
}
- 2.1 第1章(向量)—— 心如止水,却为叶所动
效果图:
作品规律描述:
1.每一次运行生成的荷叶位置随机,大小和片数也是随机的。
2.鼠标点击,点击处出现水波,且在水波范围内的荷叶会随水波远离飘动。
3.不在水波范围内的不会飘动。
原理技术参考:
原理不难,主要是向量的各种运算:
在本作的交互部分采用的是鼠标位置与目标位置之间的向量差得到我们想要的向量。
荷叶的排斥作用主要是对这个向量取反,作为加速度加在荷叶上,使荷叶有原理鼠标原点的效果。
代码如下:
ArrayList<Leaf