艺术家Koma Tebe的开源作品👇
int f = 0;
float r = 88;
void setup() {
size(640, 640, P3D);
}
void draw() {
f++;
background(0);
for (float i = -400; i <= 400; i += 2) {
pushMatrix();
float x = sin(i) * r+width/2;
float y = cos(i) * r+height/2;
fill(255, 125 * tan(i - f / 33.0) + 125);
noStroke();
translate(x, y);
rotateZ(f / 99.0);
torus(44, 1, 3);
popMatrix();
}
}
void torus(float r1, float r2, float detail) {
int numDetail = int(detail);
for (int i = 0; i < numDetail; i++) {
float theta1 = map(i, 0, numDetail, 0, TWO_PI);
float theta2 = map(i + 1, 0, numDetail, 0, TWO_PI);
beginShape(TRIANGLE_STRIP);
for (int j = 0; j <= numDetail; j++) {
float phi = map(j, 0, numDetail, 0, TWO_PI);
float x1 = (r1 + r2 * cos(phi)) * cos(theta1);
float y1 = (r1 + r2 * cos(phi)) * sin(theta1);
float z1 = r2 * sin(phi);
vertex(x1, y1, z1);
float x2 = (r1 + r2 * cos(phi)) * cos(theta2);
float y2 = (r1 + r2 * cos(phi)) * sin(theta2);
float z2 = r2 * sin(phi);
vertex(x2, y2, z2);
}
endShape();
}
}
变量声明
int f = 0;
float r = 88;
f
是一个用于计数的整型变量,初始值为 0,主要用来控制动画的时间和效果。r
是一个浮点变量,表示环的半径,初始值为 88。
setup()
函数
void setup() {
size(640, 640, P3D);
}
setup()
是在程序开始时运行一次的函数。size(640, 640, P3D)
设置了窗口的大小为 640x640 像素,并使用 P3D 渲染模式,即三维图形渲染。
draw()
函数
void draw() {
f++;
background(0);
draw()
是一个循环执行的函数,每一帧都会调用。f++
每次调用draw()
时将f
的值加 1。background(0)
将背景色设置为黑色。
绘制环形体
for (float i = -400; i <= 400; i += 2) {
pushMatrix();
float x = sin(i) * r + width / 2;
float y = cos(i) * r + height / 2;
fill(255, 125 * tan(i - f / 33.0) + 125);
noStroke();
translate(x, y);
rotateZ(f / 99.0);
torus(44, 1, 3);
popMatrix();
}
通过一个
for
循环,从 -400 到 400 每次增加 2,用于计算环的各个位置。pushMatrix()
和popMatrix()
用于保存和恢复当前的变换状态,确保每个环的变换不会影响其他环。x
和y
是根据三角函数计算出的环的位置,偏移量为窗口的中心位置。fill()
设置了填充颜色,颜色值受tan
函数的影响,从而产生动态变化的颜色效果。noStroke()
表示不绘制形状的边框。translate(x, y)
将坐标系移动到计算得到的位置。rotateZ(f / 99.0)
使得每个环体围绕 Z 轴旋转,旋转的角度与f
成正比。torus(44, 1, 3)
调用自定义的torus
函数,绘制一个半径为 44,次要半径为 1,细节为 3 的环形体。
torus()
函数
void torus(float r1, float r2, float detail) {
int numDetail = int(detail);
for (int i = 0; i < numDetail; i++) {
float theta1 = map(i, 0, numDetail, 0, TWO_PI);
float theta2 = map(i + 1, 0, numDetail, 0, TWO_PI);
...
}
}
torus()
函数用于绘制环形体。r1
是环的主半径,r2
是环的次要半径,detail
表示环的细节程度。通过嵌套的循环,计算每个点的三维坐标以形成环形体的形状。
beginShape(TRIANGLE_STRIP)
和endShape()
用于绘制三角带,以形成环的表面。
总结来说,这段代码整体上是一个动态的三维环形体动画,利用三角函数和周期性变化的颜色创建出视觉上动感的效果。
如果对这种生成艺术感兴趣,欢迎关注我的Processing课程
我们的工作是探索编程和数学在艺术和设计中一切可能性,形式不限,艺术创作,跨界合作,展览展示,品牌活动等等。位于大洋彼岸的洛杉矶,我们的使命是建设和维护全球华人创意编程和算法艺术社群,形式有开展线上教学,举办社群活动,策划举办艺术展览,挖掘发现本地社群里值得被传播的人和事通过自媒体进行传播。
我们建了一个读者群
想进群和其他读者进行精神交流朋友
加联系微信(推送末尾)
联 系 我 们
探索数学与编程在设计与艺术中一切之可能
用运算和美学让你变更酷
主营业务
科学艺术咨询 | 公共艺术 | 未来舞台美术 | 大数据可视化 | 设计人才猎头 | 品牌Event | 教育