MiroFish这个项目,我琢磨了很久。它听起来像一个海洋生物实验室的代号,或者某款小众鱼缸App的名字,但真正做下来,你会发现它其实是一整套把“超现实主义绘画语言”转译成“日常可复现创作方法”的实验。简单说,就是用米罗那种看似随意的几何符号、有机曲线和明快色块,去画一群并不存在于现实中的鱼。这个项目不挑基础,你可以用手绘完成,也可以靠几行代码批量生成,适合插画爱好者、平面设计师、编程艺术玩家,甚至只是想找一种低成本解压方式的人。
我最初的想法很朴素:如果让米罗去画一条鱼,会是什么样?答案不是一个具体的画面,而是一套“规则”——哪些形状可以出现、颜色怎么搭配、留白占多少、线条怎样才不算“过度设计”。把这些规则逐一落地之后,MiroFish就不再是一条鱼,而是一整个可以自我繁衍的风格容器。这篇文章就把我从灵感到成稿、从手绘到代码生成的全过程记录下来,包括踩过的坑、调过的参数、废弃的版本,希望对想尝试同类型创作的人有帮助。
1. 项目定位与设计拆解
很多人看到米罗风格的画作,第一反应是“小孩子涂鸦也能画成这样”。这种误解很常见,但也恰恰说明米罗的语言足够抽象、足够潜意识化,普通观众不需要美术史知识也能感受到那种自由。可“能看懂”和“能创作”完全是两码事。MiroFish这个项目真正要解决的核心问题,就是怎么把一个看似随意的艺术风格,变成一套有边界、可执行、能反复输出的创作方法。
1.1 不只是“画一条鱼”,而是“用米罗的语法造鱼”
这个项目的第一层产出是画面,第二层产出是规则。鱼的形态只是容器,真正的内容是各种视觉符号的组合方式。我给自己定了几条规则:画面底色大概率是米黄或浅蓝;鱼身用一条流畅的闭合曲线圈出;眼、鳍、鳞片尽量用圆形、星形、线条和点来代替;整体保持大量留白。这些规则看起来简单,但每一步都在逼你思考“哪个符号放到哪个位置才不违和”。
这不是一次纯感性的绘画练习,而是一次“风格逆向工程”。我从米罗各时期作品里提取出高频出现的元素,再结合鱼的基本结构做匹配。比如米罗画里的黑色弯曲线条,用来当鱼的背鳍和尾鳍就特别合适;他常画的红色圆点,刚好可以当鱼眼珠或气泡;那种歪歪扭扭的米字星,则可以散布在鱼的身体内部,作为鳞片的替代符号。这样拆解下来,每条鱼都不一样,但一眼看去就是同一个“家族”的成员。
1.2 为什么拿“鱼”当载体,而不是别的东西
我试过用猫、用植物、用抽象人物做载体,最终还是选了鱼。原因有三:第一,鱼的身体轮廓特别适合玩曲线。米罗的线条特点是有机、圆润、临界于抽象和具象之间,而鱼从头部到尾部天然就有一条可以任意弯曲的流线,我只需要调整这条线的弧度,就能产生完全不同的气质。第二,鱼不需要画脚、画手、画五官,细节负担极低,这对非美术专业的玩家非常友好。
第三,也是更重要的一点,鱼在视觉心理学里自带“漂浮感”。米罗的画面追求的是那种悬在空中的梦境感,而一条没有海底背景、没有水的鱼,恰好能在空白画布上制造出一种失重效果。它不属于真实世界,也没有指涉某个具体场景,观众看到时会自行脑补一个谜题。这种“不解释”的张力,正是我想要的。
1.3 项目的边界感:什么时候停下来才算完成
抽象创作最容易犯的毛病是“一直加东西”。加了一个圆点觉得不够,又加一条线,再加一个色块,最后画面变成了一个毫无节奏的杂物堆。MiroFish项目从一开始就规定了三条硬性边界:第一,颜色数量不能超过五种;第二,每幅画面中装饰性符号的数量控制在七个以内;第三,鱼本体必须占据画面面积的三分之一以下。有了这几条边界,每条鱼反而更容易成立。
这也解释了为什么米罗的画看着“简单”却不空洞。他其实是在极其克制地分配视觉重量,哪里用大色块,哪里用细线条,哪里完全空白,都有自己的节奏。普通人在临摹的时候容易陷入到“抄形状”的误区,我则通过强制限制数量来逼自己思考“为什么要放这个符号”,而不是“还能放什么符号”。这种减法训练,比单纯练线条更有效。
2. 创作前的准备与灵感收集
MiroFish看起来像是一拍脑门的随性涂鸦,但真正高质量的系列作品,背后一定有大量的准备工作和素材积累。我在正式动笔前,花了两三天做色彩试验、形状提炼和构图推演。比起工具本身,这一步的思考深度才决定了最终画面的气质,如果你跳过它直接开始画,很容易在画到第三张时发现画面千篇一律。
2.1 新手友好的工具清单与工作环境
先说工具,我分成手绘版和数字版两套方案,看你更习惯哪种工作流。
手绘版的核心配置是:一支墨线笔(推荐0.1mm到0.5mm的针管笔,用来勾轮廓和画符号)、一盒水粉或丙烯颜料(主要用到米黄、钴蓝、大红、柠檬黄、草绿这五种)、几支不同大小的平头刷和圆头刷、一张带纹理的水彩纸。如果你不喜欢调颜料,也可以直接用色粉笔或马克笔代替,但马克笔的色彩明度比较难控制,容易画得俗气,新手慎用。
数字版我建议用iPad上的Procreate配合Illustrator。Procreate负责快速画草稿和试验色彩方案,Illustrator负责把最终选定的图形转成矢量化输出,方便后续印刷、做贴纸或者排版。如果你是编程方向,也可以只用p5.js这类工具,我在第4节会专门讲。
环境方面,不需要刻意布置工作室,但有一点很重要:尽量把画纸固定好,避免手抖。我习惯用美纹纸把水彩纸四周贴到桌面上,这样来回描线时纸张不会滑动,线条质量会高很多。
2.2 建立自己的米罗风格色彩库
很多人在抽象画里把颜色用得很“脏”,根本原因不是不会配色,而是没有提前建立色彩约束。我的做法是提取米罗作品里的高频配色,整理成一张基础色卡,然后在这个范围内做组合试验。下面这张表是我实际用到的,直接参考就行。
| 色彩角色 | 推荐色值 | 使用频率 | 常见用途 |
|---|---|---|---|
| 背景底色 | 米黄 #F4E9D0 | 高 | 整幅画面的基座,制造温暖感 |
| 背景底色备选 | 浅蓝 #BFD8D2 | 中 | 需要更冷静氛围时使用 |
| 主色块 | 大红 #D94F31 | 高 | 鱼身主体、视觉焦点 |
| 辅助色块 | 钴蓝 #2A4A8E | 中 | 鳍、星形符号、背景装饰 |
| 跳跃色 | 柠檬黄 #F2C84B | 低 | 圆点、小星星,起到点亮画面作用 |
| 平衡色 | 黑色 #222222 | 高 | 一切轮廓线和馅细节 |
| 点缀色 | 草绿 #5E8C5A | 低 | 偶尔用来打破红蓝黄的惯性配比 |
有了这张色卡,每张画的上色时间会大幅缩减。我不会再花时间犹豫“这里用蓝色还是绿色”,而是直接按照角色来匹配。如果你自己建立色卡,记得认真记录你实际调出来的色值,尤其是水粉颜料,干湿状态下颜色会略有差异,最好在试色卡上先涂一层干透再看。
2.3 构图与留白:呼吸感才是米罗的灵魂
构图这件事,看着很玄,其实有非常具体的操作方法。我在MiroFish里总结出来的经验是:把画布想象成一个舞台,鱼不是唯一的主角,留白也是一个有分量的角色。常见的错误做法是让鱼充满整个画面,背景被挤压得只剩下一条窄边,这样会直接失去米罗原有的空间纵深感。
我更建议的做法是:把鱼放在画布中央偏上的位置,让画面下方和左侧留出大片空白。这样一来,鱼就像悬浮在虚空中,观者的视线有地方可以“喘气”。构图时可以用眼睛盯住四个角,如果任何一个角填得太满,就需要删减。还有一个很实用的判断方法:把画拿远半米再看一眼,如果你第一眼看到的是“一个图形组合”而不是“一整片图案”,说明留白基本到位了。
3. 从零手绘一只MiroFish
手绘环节是整个项目里最“疗愈”也最需要耐心的部分。我会分三段来讲:起稿、填充符号、上色勾线。每一步都配合具体的操作要点,尽量还原我实际画的过程,方便你照着试。
3.1 起稿:先画骨架线,不要直接画轮廓
我见过很多新手一上来就画鱼的完整外轮廓,然后发现线怎么画都不流畅,原因在于你对鱼的三段式结构(头、身、尾)没有提前规划。我的做法是先画三条辅助线:第一条是鱼的脊椎线,决定整体弧度;第二条是鱼身中轴线的垂直线,用来确定身体重心;第三条是尾巴分叉的中线,用来规划尾鳍的走向。
这三条线最好画得很轻,用HB铅笔,下笔力道控制在刚好能看清即可。画完以后,围绕着脊椎线用椭圆轻轻圈出鱼身的范围,注意椭圆不要太完美,稍微拉长一点、偏向一侧反而更有米罗的味道。尾巴可以不画成标准扇形,而是用一条类似弯钩的弧线分向一侧,这是米罗线条里很典型的“歪着长”的形态。
3.2 用符号填充细节:圆点、星星、小眼睛和曲线
鱼身轮廓确定以后,紧接着要做的不是上色,而是确定“符号布局”。这个顺序特别重要,因为符号的摆放会直接影响后续色块的分割。我一般会在脑海里把鱼身分成三段:头部区域放眼睛和一小簇星形;身体中部放两三个大小不一的圆点,或是一段类似音符的短曲线;尾部区域放几个散点的黑色圆点。
一个比较百搭的布置逻辑是“三点定场”。具体来说,在鱼身上选择三个不同大小、不同疏密度的位置放符号,让它们形成一个视觉三角形,这样画面就不会出现一边倒。米罗作品里常见的“米字星”也非常好用,画法很简单:在纸上点一个小圆点,然后围绕圆点向外画三四条短线,形成一个类似星芒的符号。我通常会把米字星放在鱼眼睛的斜上方或鱼腹下方,用来打破大块面积的沉闷感。
3.3 上色与勾线:先浅后深,黑色线条负责收尾
上色的顺序我从失败里总结了一句口诀:先铺底、再上鱼、然后加装饰色、最后勾黑线。具体到一条鱼,流程是这样的。
第一步,用米黄色铺满整张纸。只铺薄薄一层,形成底色,也顺便让手绘纸的纹理感显现出来。第二步,用大红或钴蓝画出鱼身的主体色块,这一步不需要涂得太满,可以留出部分底色漏出来,这样鱼身体会有一种“呼吸感”。第三步,把圆点、星形、鳍上的小块颜色另外补上,这个阶段用的是柠檬黄和草绿。最后一步,等颜料干透后,用黑色勾线笔沿着鱼身轮廓和一些关键符号描一遍。记住一个要领:黑线的宽度要有变化,在视觉重点处(比如鱼眼睛)可以稍微画粗一点,在装饰元素上则保持纤细。
颜料未干时千万别急着上墨线,否则墨会渗透进湿润的颜料里,线条边缘会晕开,画面瞬间显得邋遢。每次上色之前,可以先用吹风机冷风档快速吹干,这个在批量画系列作品时能省下不少等待时间。
4. 进阶玩法:用代码批量生成MiroFish
手绘的乐趣在于不可控,但如果你希望得到一个系列作品、一套壁纸,或者想尝试大量试错,那人力画上二三十条鱼就不划算了。MiroFish最让我上头的部分,其实是中期写了一个小小的生成程序,让代码来扮演那个握毛笔的手。这一节我会给出一个能跑起来的p5.js示例,并解释背后几个关键参数是怎么定的。
4.1 为什么用p5.js而不是直接学复杂的生成艺术框架
市面上的生成艺术工具很多,Processing功能很强,但需要配置Java环境;openFrameworks适合做高性能项目,但对新手来说门槛偏高。p5.js的优势在于它是纯浏览器端运行,打开一个HTML文件就能看到结果,而且语法接近JavaScript,像我这种半路出家的编程爱好者上手几乎没有压力。对于MiroFish这种“随机生成二维图形”的场景,它的能力完全够用。
更关键的一点,p5.js可以让我们把“手绘时的那种随机感”转译成代码里的随机数。比如手绘线条在颤抖,代码里就用微小的噪声偏移模拟;手绘时每个圆点大小不同,代码里就是random(5, 20)这样的区间。这个转译过程本身就很有乐趣,你会发现原来“风格”是可以被量化的。
4.2 一套很小的随机鱼生成器
下面这段代码是MiroFish生成器的最小版本。它做的事情很简单:在画布中央画一条由贝塞尔曲线构成的鱼身,随机生成尾巴、眼睛、圆点和星形,并从预设色彩库里随机挑三种颜色填色。
let colors = ['#D94F31', '#2A4A8E', '#F2C84B', '#222222', '#5E8C5A']; function setup() { createCanvas(800, 600); noLoop(); background('#F4E9D0'); } function draw() { let centerX = width / 2; let centerY = height / 2; let bodyLen = random(180, 260); let curve = random(-40, 40); // 鱼身轮廓,用三组贝塞尔曲线模拟 noFill(); stroke('#222222'); strokeWeight(random(2, 4)); beginShape(); vertex(centerX - bodyLen / 2, centerY + curve); bezierVertex(centerX - bodyLen / 4, centerY - 40, centerX + bodyLen / 4, centerY + 40, centerX + bodyLen / 2, centerY - curve); endShape(); // 尾巴 line(centerX + bodyLen / 2, centerY - curve, centerX + bodyLen / 2 + random(30, 50), centerY - random(30, 60)); line(centerX + bodyLen / 2, centerY - curve, centerX + bodyLen / 2 + random(30, 50), centerY + random(30, 60)); // 随机圆点和星形 let dotCount = int(random(3, 6)); for (let i = 0; i < dotCount; i++) { fill(random(colors)); noStroke(); let dotX = centerX + random(-80, 80); let dotY = centerY + random(-40, 40); circle(dotX, dotY, random(10, 35)); } // 米字星 stroke(random(colors)); strokeWeight(random(1, 3)); let starX = centerX + random(-50, 50); let starY = centerY + random(-80, 80); for (let j = 0; j < 4; j++) { let angle = (TWO_PI / 4) * j + random(-0.2, 0.2); line(starX, starY, starX + cos(angle) * random(12, 25), starY + sin(angle) * random(12, 25)); } }运行这段代码,每刷新一次画面,你就能得到一条新的MiroFish。它当然不如手绘精致,但它最大的价值是“快速铺量”:你可以一次性生成几千张图,再从中挑出那些真正有“神韵”的进行二次加工。我的做法是先把程序跑出来的鱼导出成透明底PNG,再拖进Photoshop里加一些手绘质感噪点,最终效果十分接近原始手绘的感觉。
4.3 从单条鱼到系列作品:排版、命名与周边应用
生成程序的另一个好处是可以轻松产出“同家族不同个体”。我按照鱼形弧度、装饰符号数量、色彩组合三个维度做筛选,挑出二十条鱼组成了一组MiroFish家族系列。然后把这些鱼排在一张约800x1200的画布上,每行三条,形成类似“物种图谱”的展示方式,看起来特别像一位超现实主义生物学家留下的考察图鉴。
排版完成后,这批图可以直接做成手机壁纸、社交头像,或者印刷成帆布包和T恤图案。我试过把其中一条鱼印到帆布袋上,效果很好,因为米罗风格的色彩明度高、造型简洁,放在大面积纯色面料上反而更有辨识度。如果你走这套流程,建议在导出时保留两份文件:一份是300dpi的CMYK模式的PSD,用于印刷;另一份是72dpi的sRGB模式的PNG,用于线上展示。两种文件的使用场景不一样,提前分好能省掉很多返工。
5. 常见问题与避坑实录
做MiroFish这个项目的过程中,我废掉的作品比留下来的多得多。有很多问题第一次碰见时觉得是手气不好,多画几张才发现背后是有规律可循的。我把遇到最多的三类问题整理在这里,附带我的排查思路和解决办法,希望能帮你少走弯路。
5.1 画得太“像鱼”怎么办
这是新手最容易遇到的问题。你要一条鱼,结果画出来的鱼解剖学上完全正确:标准纺锤形身体、分叉均匀的燕尾、清晰的鳃盖线,看起来像教科书插画,正因为它太像鱼,反而失去了米罗的抽象气质。遇到这种情况,不要马上重画,而是做三件事:第一,把轮廓改成不对称形状,比如让鱼背更拱、鱼腹更平;第二,减少鱼体的内部细节,擦掉鳃盖线和鳞片线,只留下三四个符号;第三,把鱼眼改成错位的位置,比如移到脸颊边缘,或者干脆用一颗星代替。
说白了,写实的“像”是束缚,抽象风格的“像”才是目标。你不需要观众一眼认出那是一条鱼,只需要让他们隐约感到“这个东西在水里游过”。
5.2 颜色发脏、画面浮躁的调色技巧
水粉颜料上色时最常遇到的问题是“颜色看起来很脏”。原因通常有两种:一是颜色直接混合得太复杂,比如蓝色里混了红色再混了一点黄色,结果得到的蓝完全失去了明度;二是没有利用黑白灰去间隔画面。我的解决办法很粗暴:把整张画面限制在“三种高饱和颜色 + 黑色 + 米黄色底色”这个区间里。这样即使某个颜色涂得不均匀,大环境也能把它衬托得很干净。
如果上完色后发现整体太跳,可以用一层薄薄的白色或米黄色在局部区域做罩染,降低明度对比。这个技巧很像化妆时用遮瑕膏来统一肤色,能让画面瞬间安静下来。
5.3 印刷输出时效果不如屏幕
线上看颜色鲜艳亮眼,印出来却灰蒙蒙甚至偏色,这是整个项目里最煞风景的问题。主要原因有两块:第一,显示器用RGB色彩空间,印刷机需要CMYK,两者色彩范围不同,一些特别鲜艳的颜色(比如荧光黄)印出来会直接变暗;第二,印刷时如果图案边缘没有做“出血”扩展,裁切时很可能切掉一条鱼尾巴。
我建议你第一次印小样前,先把设计文件里的所有颜色仔细调低10%到15%的饱和度,因为在印刷机上通常会偏饱和一些。同时存储文件时生成一份带3mm出血位的版本,导出两种格式:CMYK的PDF用于印刷厂,sRGB的PNG用于线上预览。这样能最大程度避免“屏幕上仙气飘飘,实物上灰头土脸”的情况。
我在实际使用中发现,MiroFish这个项目最迷人的地方在于它允许你有大量“废稿”,而每一张废稿都在帮你慢慢找到那个属于你自己的视觉语言。画到第十条鱼的时候,我已经不再牵挂“米罗会怎么画”了,而是想着怎么让这条鱼更像我想象中的某个朋友或某段记忆。如果你也打算试一把,我的建议是别纠结于一步到位,先把十张画纸都铺开,它们会带着你和这个项目的走向。