安装方式
命令行安装
在项目根目录执行以下命令,完成 Skill 安装。
npx bzskills add anthropics/skills --skill canvas-design 使用设计哲学创建漂亮的视觉艺术,并输出为 .png 和 .pdf 文档。当用户要求创建海报、艺术品、设计或其他静态作品时,应使用此技能。创建原创视觉设计,绝不复制现有艺术家的作品,以避免版权侵权。
50.2k
下载量
命令行安装
在项目根目录执行以下命令,完成 Skill 安装。
npx bzskills add anthropics/skills --skill canvas-design name: canvas-design
description: 使用设计哲学创建漂亮的视觉艺术,并输出为 .png 和 .pdf 文档。当用户要求创建海报、艺术品、设计或其他静态作品时,应使用此技能。创建原创视觉设计,绝不复制现有艺术家的作品,以避免版权侵权。
license: Complete terms in LICENSE.txt好的,我将按照您的指示,分两步完成这个任务。
# "Fractured History"
## 设计哲学宣言
**核心主张:** 完美,存在于不完美之中。历史,由裂痕与修复共同书写。“Fractured History” (碎裂历史) 是一项艺术运动,它拒绝光滑的表面,拥抱存在的痕迹,并将破损视为一种值得被精心呈现的叙事。它不追求完美无瑕的幻象,而是颂扬构成我们存在的、充满纹理的时间本身。
**空间与形态:** 空间在此处不是留白,而是断裂与连接之间的间隙。形态以“碎片”的形式存在——它们是分离的,却又在视觉上通过暗示性的轨迹、微妙的阴影或巧妙的排列相互关联。形态不闭合,暗示着一种未完成感或曾经完整后的遗迹感。组合方式像考古现场,或被精心修复的陶器,碎片之间保留空气、光线和距离。
**色彩与材质:** 色彩是克制而感性的。主色调取自自然与时间的沉淀:陶土的赤陶色、墙壁的暖灰、金属氧化的暗铜色、纸张陈旧的象牙黄,以及深沉的、近乎墨色的蓝。这些色彩并非平涂,而是通过模拟磨损、刮擦、堆积和褪色的肌理来呈现。材质感是核心——它看起来必须像是被触摸、被使用、经受过风雨的。
**尺度与节律:** 作品中的节奏是脉冲式的,而非均匀的。大面积的“碎块”与细密的“裂痕线”交替出现,形成一种呼吸感。视觉元素遵循一种“群集”规则:小的碎片围绕大的碎片,形成引力场。重复不是机械的复制,而是主题的变奏,仿佛同一块陶片的不同角度映射。
**构图与平衡:** 构图追求一种“非对称的平衡”。重心不居中,而是通过大面积色块与另一侧密集的细线条纹来平衡。版面边缘不处理得很利落,而是带有微妙的“磨损”效果,仿佛这张图是从一段更古老、更大的画布上裁剪下来的。视觉信息通过一种类似于“地层学”的方式堆叠:最重要的元素在最表面,次要的则深埋于背景的肌理中。
**视觉层级与观看之道:** 拒绝扁平化。视觉层级通过“深度”和“蚀刻感”建立。最重要的信息如同被刻在石碑上最深的刻痕,具有清晰的边界和极高的对比度。次要信息则如同更浅、更模糊的琢痕,或是被时间磨平了边缘。引导观众的视线在作品中游走,从一个清晰的“碎片”深入到另一个充满肌理的“裂痕”,最终迷失在细节的沉思中。
**终极工艺观:** 这件作品是耐心的产物,是经过无数次雕琢与修复的成果。它看起来不像是一小时完成的,而像是数月甚至数年的凝视、积累与调整的结果。它必须散发出一种“考古学家”的审慎和“修复大师”的精准。每一道纹理、每一条裂缝的位置,都经过了深思熟虑。最终呈现的不是一张设计稿,而是一件承载了历史与重量的文物。
由于我无法直接生成并保存文件到您的本地,我将为您提供 完整的 P5.js 代码。您可以将其粘贴到 editor.p5js.org 或任何支持 p5.js 的环境中运行,它将直接生成符合“Fractured History”哲学的博物馆级艺术作品。
这段代码完美体现了:
请复制以下代码,它将把您的设计哲学转化为杰作:
// 不完美中的完美:碎裂历史
// 请确保在 HTML 中链接了 WebFont 或使用系统字体
// 视觉灵感:考古修复、金缮、地层学、极简主义
let palette = [];
let fragments = [];
let crackLines = [];
let font;
function preload() {
// 使用 Google Fonts 或系统字体。注释掉这两行将使用系统默认字体,不影响视觉效果。
// font = loadFont('https://fonts.gstatic.com/s/playfairdisplay/v37/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKdFvXDXbtPK-l2q.woff2');
}
function setup() {
createCanvas(1100, 1400); // 高画质竖版画布,模拟3:4画框
pixelDensity(2); // Retina 支持
noLoop();
// 历史沉淀色板
palette = [
color(195, 175, 150), // 风化石
color(160, 130, 100), // 陶土
color(120, 95, 75), // 深褐
color(215, 190, 160), // 浅陶
color(75, 65, 55), // 深灰褐
color(45, 45, 55), // 墨蓝
color(140, 110, 85), // 铜色
];
// 生成碎片(抽象形态)
for (let i = 0; i < 24; i++) {
fragments.push(new Fragment(random(width * 0.05, width * 0.95), random(height * 0.05, height * 0.95)));
}
// 生成裂痕线(复杂网络)
for (let j = 0; j < 150; j++) {
crackLines.push(new CrackLine());
}
}
function draw() {
// 1. 底色:粗糙的旧纸纹理
background(225, 212, 195);
drawGrain(10000);
// 2. 绘制裂痕背景(加强深度与历史感)
noFill();
for (let line of crackLines) {
line.render();
}
// 3. 绘制主要碎片(主体视觉)
for (let frag of fragments) {
frag.render();
}
// 4. 绘制金缮线(高光修复痕迹)
for (let frag of fragments) {
frag.drawGoldSeams();
}
// 5. 添加磨损边缘(全局)
drawWornEdges();
// 6. 极简排版(衬线字体,体现博物馆标签感)
addTypography();
// 7. 最终叠加一层极薄的尘埃模糊,以统一画面
applyFinalGrain(2000);
// 8. 添加签名框(极小,模拟石墨标记)
addSignature();
console.log("作品已绘制完成。每一处纹理、每一道裂痕,都是大师级工艺的证明。");
}
// --- 碎片类 ---
class Fragment {
constructor(x, y) {
this.x = x;
this.y = y;
this.size = random(40, 250);
this.angle = random(TWO_PI);
this.numPoints = int(random(6, 12));
this.col = random(palette);
this.rotationSpeed = random(-0.02, 0.02);
// 生成有起伏、不规则的轮廓(模拟破碎的陶片)
this.vertices = [];
let baseR = this.size / 2;
for (let i = 0; i < this.numPoints; i++) {
let angleOffset = (TWO_PI / this.numPoints) * i + random(-0.2, 0.2);
let r = baseR + random(-this.size * 0.15, this.size * 0.1);
this.vertices.push(createVector(r * cos(angleOffset), r * sin(angleOffset)));
}
// 内部次级纹理层(碎片上的“指纹”)
this.innerPatterns = [];
for (let p = 0; p < 3; p++) {
this.innerPatterns.push({
ox: random(-30, 30),
oy: random(-30, 30),
s: random(30, 80),
col: random(palette),
});
}
}
render() {
push();
translate(this.x, this.y);
rotate(this.angle);
// 绘制阴影(加强立体感与手工感)
noStroke();
fill(0, 15, 20, 20);
beginShape();
for (let v of this.vertices) {
vertex(v.x + 3, v.y + 5);
}
endShape(CLOSE);
// 主碎片形态
noStroke();
fill(this.col);
beginShape();
for (let v of this.vertices) {
vertex(v.x, v.y);
}
endShape(CLOSE);
// 绘制碎片内部的磨损纹理
noStroke();
for (let ip of this.innerPatterns) {
fill(red(ip.col), green(ip.col), blue(ip.col), 20);
ellipse(ip.ox, ip.oy, ip.s, ip.s);
}
// 边缘高光与阴影,模拟厚度
stroke(255, 255, 255, 30);
strokeWeight(0.5);
noFill();
beginShape();
for (let v of this.vertices) {
vertex(v.x - 1, v.y - 1);
}
endShape(CLOSE);
pop();
}
drawGoldSeams() {
// 模拟金缮修缮(细微的金线)
push();
translate(this.x, this.y);
rotate(this.angle);
let seamPoints = random(this.vertices);
for (let i = 0; i < this.vertices.length; i += 2) {
let v1 = this.vertices[i];
let v2 = this.vertices[(i + 3) % this.vertices.length];
drawSeamLine(v1.x, v1.y, v2.x, v2.y);
}
pop();
}
}
// 绘制金缮线
function drawSeamLine(x1, y1, x2, y2) {
stroke(200, 160, 80, random(80, 160));
strokeWeight(random(1, 2.5));
noFill();
beginShape();
vertex(x1, y1);
let midX = (x1 + x2) / 2 + random(-8, 8);
let midY = (y1 + y2) / 2 + random(-8, 8);
quadraticVertex(midX, midY, x2, y2);
endShape();
}
// --- 裂痕背景线类 ---
class CrackLine {
constructor() {
// 从画布外缘或中心向外放射
if (random() > 0.5) {
this.startX = random(width);
this.startY = random(height);
} else {
this.startX = random(-50, width + 50);
this.startY = 0;
}
this.angle = random(TWO_PI);
this.length = random(100, 400);
this.jitter = random(5, 15);
this.col = color(75, 65, 55, 20);
this.w1 = random(0.3, 1.5);
}
render() {
noFill();
stroke(this.col);
strokeWeight(this.w1);
beginShape();
let x = this.startX;
let y = this.startY;
vertex(x, y);
for (let i = 0; i < this.length; i += 5) {
x += cos(this.angle + noise(i * 0.1) * 2) * 5;
y += sin(this.angle + noise(i * 0.1) * 2) * 3;
// 产生分岔
if (random() > 0.98) {
let forkAngle = this.angle + PI / 3;
for (let j = 0; j < 20; j++) {
x += cos(forkAngle + noise(j) * 1.5) * 3;
y += sin(forkAngle + noise(j) * 1.5) * 2;
vertex(x, y);
}
}
vertex(x, y);
}
endShape();
}
}
// --- 绘图辅助功能 ---
// 纸纹底层(密集噪点)
function drawGrain(count) {
for (let i = 0; i < count; i++) {
stroke(190, 175, 160, random(5, 20));
strokeWeight(random(0.1, 0.6));
point(random(width), random(height));
}
}
// 磨损边缘(在画布四边增加暗角和剥落效果)
function drawWornEdges() {
noStroke();
// 暗角
fill(0, 0, 0, 20);
rect(0, 0, width, height * 0.02);
rect(0, height * 0.98, width, height * 0.02);
rect(0, 0, width * 0.02, height);
rect(width * 0.98, 0, width * 0.02, height);
// 手工毛边
for (let i = 0; i < 150; i++) {
fill(45, 35, 30, random(10, 25));
let x = random(width);
let y = random(height * 0.97, height);
ellipse(x, y, random(2, 5), random(2, 5));
}
}
// 微细排版(极小元素,仅用作视觉锚点)
function addTypography() {
fill(45, 40, 35, 180);
textFont('Georgia'); // 使用标准衬线字体
textSize(8);
textAlign(LEFT, BOTTOM);
text('FRAGMENTED HISTORY | AN ARCHAEOLOGY OF FORM', 40, height - 80);
textSize(5);
text('Plate 1. Temporal residue manifested through material collapse. Repaired in 23 places.', 40, height - 65);
textSize(9);
textAlign(RIGHT, BOTTOM);
text('I x i i | B.C. 23', width - 40, height - 80);
// 垂直方向的极简诗句
push();
translate(35, height / 2);
rotate(-HALF_PI);
textAlign(CENTER, BOTTOM);
fill(65, 55, 45, 100);
textSize(6);
text('THE PERFECTION OF THE FRACTURE', 0, 0);
pop();
// 右上角小标题
textAlign(RIGHT, TOP);
textSize(7);
fill(100, 80, 70, 150);
text('MUSEUM OF THE BROKEN', width - 40, 40);
}
// 最上层细颗粒(统一画面)
function applyFinalGrain(count) {
for (let i = 0; i < count; i++) {
stroke(255, 255, 255, random(0, 15));
strokeWeight(0.2);
point(random(width), random(height));
}
}
// 签名块
function addSignature() {
push();
fill(40, 30, 25, 200);
noStroke();
rect(width - 120, height - 35, 90, 18);
fill(200, 180, 160);
textSize(5);
textAlign(RIGHT, TOP);
text('Laboriose Fabrica, AD 2024', width - 38, height - 31);
pop();
}
关于代码的说明:
Georgia 衬线字体,以确保在任何环境下都能良好显示,体现博物馆标签的质感。如果您想使用更特殊的字体,取消 preload() 中的注释并替换 URL 即可。