2026/10/21 8:57:43

技术人做艺术:从代码到手工感的生成艺术实践指南

技术人做艺术:从代码到手工感的生成艺术实践指南 1. 从“artcraft”这个名字说起它到底想解决什么问题第一次看到“artcraft”这个标题我脑子里蹦出来的第一反应是这大概率不是一个单纯的绘画工具也不是一个纯粹的手工教程合集。它更像是一个把“艺术art”和“手艺craft”捏在一起的复合概念——用代码或者数字工具去做一些有手工质感、有创作温度的东西。后来跟几个做独立开发的朋友聊发现大家对这个词的理解出奇地一致它指向的是一种“技术人做艺术、手艺人用技术”的交叉地带。这个定位其实挺微妙的。市面上纯艺术创作工具已经很多了纯手工教程也遍地都是但真正把两者打通、让一个写代码的人也能做出有审美价值的作品、让一个做手工的人也能用数字手段提升效率的内容反而稀缺。artcraft 要填的就是这个缝。它适合的人群也很明确有一定动手能力、对视觉输出有要求、但不一定受过专业美术训练的技术爱好者或者手作爱好者。你不需要会画素描也不需要懂复杂的图形学公式但你需要愿意动手试、愿意调参数、愿意接受“第一次做出来很丑”这个事实。我之所以对这个方向感兴趣是因为过去几年里我陆续做过一些生成艺术的小项目也帮朋友做过手工皮具的版型数字化。踩过的坑不少最大的一个体会是技术思维和手工思维之间的鸿沟比想象中要大得多。写代码的人习惯精确控制、可复现、参数化做手工的人习惯手感、随机性、材料反馈。artcraft 这个方向如果做得好就是在这两种思维之间架一座桥。下面我会从几个实际场景出发把这座桥怎么搭、搭的时候哪些地方容易塌一点点拆开讲。2. 技术人做视觉创作时最容易掉进去的三个思维陷阱2.1 陷阱一把“精确”当成“美”的充分条件写代码出身的人有一个根深蒂固的习惯一切都要可控。变量要初始化循环要有边界输出要可预测。这个习惯在工程领域是美德但在视觉创作里往往是灾难。我最早做生成艺术的时候写了一个基于网格的图案生成器每个格子的颜色、大小、位置都由公式精确计算。跑出来的结果确实很“整齐”但看久了会觉得死板像Excel表格自动填充出来的东西。后来一个做插画的朋友看了说了一句让我印象很深的话“你的图里没有意外。”这句话点醒了我。手工制品的魅力恰恰在于那些微小的不完美——手绘线条的抖动、陶器釉色的随机流淌、木纹的自然走向。这些“意外”不是缺陷而是温度的来源。所以在 artcraft 类的项目里我后来会刻意引入受控的随机性给每个参数加一个很小的扰动范围让每次生成的结果都有细微差异。这个扰动不能太大否则就变成噪声了也不能太小否则看不出来。我的经验值是主参数的5%到15%之间具体取决于你想要的“手工感”强度。2.2 陷阱二过度依赖现成库失去对底层参数的手感现在做图形生成的库非常多从二维的Canvas操作到三维的渲染引擎文档齐全、示例丰富上手很快。但问题也在这里太容易了。你调一个函数传几个参数出来一张图看起来还不错但你其实不知道那张图为什么长这样。一旦想调整风格就只能在库的文档里翻来翻去试各种参数组合效率极低。我的做法是在用任何高层库之前先花半天时间用最基础的方式实现一遍核心逻辑。比如做粒子效果先用最原始的循环和坐标计算画一百个点手动控制它们的位置和颜色感受一下点的大小、密度、分布规律对整体视觉效果的影响。这个过程很枯燥但做完之后你对“参数”的理解会完全不一样。你知道改哪个值会让画面变密、改哪个值会让颜色偏移、改哪个值会让运动变快。这种手感是看文档看不来的。2.3 陷阱三忽略输出介质对创作决策的反向影响这个坑我踩得最惨。有一次我花了两天时间调了一组生成图案在屏幕上看着非常满意颜色过渡细腻、层次丰富。然后我把它打印出来准备贴墙上结果发现打印出来的效果完全不对——暗部糊成一团亮部过曝整体灰蒙蒙的。原因很简单屏幕是加色模式RGB光是直接射进眼睛的纸张是减色模式CMYK光是反射回来的。同一组数值在两个介质上的表现可以差很远。从那以后我在项目一开始就会问自己这个东西最终是要显示在屏幕上还是要打印出来还是要做成实物如果是屏幕显示我可以大胆用高饱和度和对比度如果是打印我就要把颜色控制在印刷色域内并且预留足够的亮度余量如果是做成实物比如刻成模板、绣成图案我还要考虑线条的最小宽度、颜色的数量限制。这个决策越早做越好因为它会影响你后面所有的参数选择。3. 从零搭建一个 artcraft 小项目的完整操作链路3.1 环境准备少即是多很多人一上来就想着装一堆工具什么IDE、什么版本管理、什么构建工具光环境配置就花掉半天。我的建议是第一个 artcraft 项目用最轻量的方式启动。如果你做的是网页端的生成艺术一个HTML文件加一个浏览器就够了。把Canvas或者SVG的API直接写在script标签里双击打开就能看到效果。不需要Node.js不需要打包工具不需要框架。这些东西等你确实需要的时候再加一开始加进来只会增加干扰。如果你做的是偏手工方向的项目比如用数字工具辅助做纸艺或者布艺的版型设计那核心工具就是一个矢量绘图软件加一台能精确输出的设备打印机或者切割机。矢量软件的选择上我倾向于用开源的那几个功能足够而且导出的格式通用性好。不要一上来就买昂贵的专业软件等你确定这个方向能持续做下去再升级。3.2 第一个可运行的原型从“能看”到“好看”的距离我习惯把第一个原型做得极其简单简单到你觉得“这也能叫作品”的程度。比如做一个生成图案的项目第一个版本就是画一百个随机位置、随机颜色的圆。跑出来一看乱七八糟像打翻的颜料盘。但这个版本验证了一件事你的环境是通的代码能跑输出能看到。这就是最大的价值。接下来才是真正花时间的地方调整。把随机位置改成有规律的分布把随机颜色改成从一组预设色板里取把圆的大小和位置关联起来。每改一个参数刷新一次观察变化。这个过程可能要重复几十次甚至上百次。我通常会准备一个文本文件每次调整都记一笔改了什么、效果如何、下一步想试什么。这个记录看起来笨但当你调了三十次之后回头看能清楚看到自己的决策路径避免在原地打转。这里有一个很实用的技巧把关键参数提取到代码最上面用单独的变量控制。这样你每次只需要改那几个数字不用在代码里翻来翻去。更进一步你可以做一个简单的控制面板用滑块来实时调整参数。HTML里用input range就能实现几十行代码的事但效率提升巨大。3.3 参数调优的实操记录一次真实的迭代过程我拿之前做过的一个“数字编织”项目举例。目标是生成一组看起来像手工编织纹理的图案。第一版用正弦波控制线条的起伏线条间距固定。结果太规律了像机器画的。第二版给每条线的起始相位加随机偏移。结果好一些但整体还是太“干净”。第三版给线条的粗细也加随机变化并且让相邻线条的粗细变化有相关性用同一个随机种子控制一组线。结果开始有手工感了但颜色太单一。第四版从一组大地色系里随机取色并且让颜色沿着画布有一个缓慢的渐变趋势。结果基本满意但边缘太整齐。第五版在画布边缘加一个渐隐的遮罩让图案像是从中间“长”出来的。最终效果朋友看了说像是一块手工织的毯子。这个过程里最关键的一步是第三版的“相关性随机”。如果每条线的粗细完全独立随机看起来就是噪声但如果一组线的粗细变化是相关的看起来就像是有意为之的手工痕迹。这个原理在手工里很常见一个手艺人织布的时候力度会有变化但这个变化是渐进的、有惯性的不是每根线都重新掷骰子。用代码模拟这种“惯性”是让数字作品有手工感的核心技巧之一。4. 手工思维反过来能给技术项目带来什么4.1 材料限制反而激发创造力做手工的人有一个天然约束材料是有限的。一块布就那么大一盒颜料就那几个色一根线就那么长。这种限制在技术人看来是束缚但在手艺人看来是创作的起点。我在做数字项目的时候会刻意给自己加类似的限制这个项目只用三种颜色那个项目只用直线另一个项目所有元素必须在一个圆形范围内。限制越具体出来的东西反而越有辨识度。举个例子我之前做一个生成海报的项目一开始什么参数都能调结果做出来的东西四不像。后来我规定只能用黑、白、红三种颜色所有文字必须水平或垂直排列图形只能用矩形和圆形。在这个框架下我反而很快找到了几个满意的方案。因为选择少了每个选择的分量就重了你会更认真地对待每一个决定。4.2 手工的“时间感”如何转化为数字体验手工制品有一个特点是时间留下的痕迹皮具会随着使用变色陶器会有窑变的纹理木器会有包浆。这些痕迹是时间的可视化。数字作品通常是“瞬间”的生成就生成了没有过程。但你可以通过一些手段把时间感加进去。比如让生成过程是渐进的用户能看到图案一点点长出来或者让每次刷新都有微小的变化像是作品在“呼吸”或者记录用户的交互历史让图案随着交互次数增加而逐渐变化。我在一个项目里做过这样的尝试用户每次点击画布就在点击位置生成一个元素元素的大小和颜色取决于点击的时间间隔。点得快元素就小而密点得慢元素就大而疏。这样最后生成的图案实际上记录了用户的操作节奏有点像手工制作时留下的手势痕迹。这个功能实现起来不复杂但体验上了一个台阶。4.3 从“完成品”到“半成品”的思维转变手工领域有一个概念叫“半成品”比如织了一半的毛衣、捏好还没烧的陶坯。半成品是有生命力的因为它还有变化的可能。技术项目通常追求“完成”代码写完、功能实现、测试通过就结束了。但 artcraft 类的项目我觉得更好的状态是“半成品”你提供一个框架、一组工具、一些默认参数但最终的作品是用户参与完成的。这个思路转变会直接影响你的设计决策。比如你会更注重工具的可组合性而不是功能的完整性你会提供更多的“钩子”让用户自定义而不是把所有可能性都写死你会把默认参数调得相对保守留出足够的调整空间。我做过一个生成字体的小工具一开始想做成“输入文字、输出字体”的完整流程后来改成“提供笔画组件、用户自己拼字”虽然完成度低了但可玩性高了很多用户会花更多时间在上面折腾。5. 那些只有踩过才知道的坑一份避坑清单5.1 性能问题往往出在意想不到的地方做视觉项目性能是绕不过去的。但新手最容易犯的错误是过早优化。我见过有人在项目刚开始就纠结用Canvas还是WebGL纠结了半天结果项目根本没做出来。我的经验是先用最慢但最简单的方式实现等确实卡了再优化。大部分情况下你以为是渲染瓶颈其实是代码里有个循环写错了或者某个数组在反复重新创建。真正需要警惕的性能陷阱是“看不见的重复计算”。比如你在每一帧里都重新计算一遍颜色映射表或者每次都重新解析一遍配置。这些操作单次很快但一秒钟跑六十次就受不了了。解决办法很简单把不变的计算提到循环外面用缓存存起来。这个原则说起来简单但在实际写代码的时候很容易忘。我的习惯是每写完一个循环就检查一遍循环体里有没有可以提出去的东西。5.2 颜色管理的坑比想象中深前面提过屏幕和打印的颜色差异这里再补充几个具体的坑。第一不同浏览器对同一组RGB值的渲染可能有细微差异尤其是涉及到透明度叠加的时候。第二如果你用了CSS的颜色函数比如hsl在不同设备上的表现也可能不一致。第三如果你从图片里取色取到的值可能带有色彩配置文件的信息直接拿来用会偏色。我的应对策略是核心颜色用十六进制写死不用颜色函数透明度尽量用预乘的方式手动计算不依赖浏览器的混合模式如果要从图片取色先用一个中间步骤把颜色转换到标准色域。这些操作看起来繁琐但能保证你的作品在不同环境下看起来是一致的。5.3 文件导出格式的选择直接影响可用性做出来的东西总要导出。屏幕展示用PNG或WebP打印用PDF或TIFF进一步编辑用SVG或AI格式。每种格式都有自己的脾气。PNG支持透明但文件大WebP压缩好但兼容性稍差SVG是矢量但复杂路径会让文件变得巨大PDF适合打印但颜色管理复杂。我踩过的一个坑是用SVG导出复杂生成图案结果文件大到浏览器打不开。原因是每个小元素都变成了独立的路径几万个路径堆在一起解析都解析不动。后来改成先栅格化再导出或者把相同样式的元素合并成一个路径问题就解决了。另一个坑是打印时忘了嵌入字体结果打印机用默认字体替换了排版全乱。这些细节在项目初期不会注意到但到了输出环节就是致命的。6. 把 artcraft 做成可持续项目的一些个人体会6.1 建立自己的素材库和参数预设做这类项目时间长了会积累很多有用的东西一组好用的颜色搭配、一套经过验证的参数范围、一些常用的图形组件。我的做法是建一个单独的文件夹把这些东西分门别类存好。颜色搭配存成JSON参数预设存成单独的配置文件图形组件存成可复用的代码片段。下次开新项目的时候直接拿过来改省掉大量重复劳动。这个素材库的价值会随着时间增长。我现在的素材库里有一百多组颜色搭配都是这些年一点点攒下来的。有些是网上看到的灵感有些是自己调出来的有些是从照片里提取的。每次开新项目先从里面挑几组试试往往能快速找到方向。这个习惯看起来不起眼但长期来看效率提升非常明显。6.2 给项目留一个“随机按钮”这是我个人最喜欢的一个设计在作品上留一个按钮点一下就用随机参数重新生成一遍。这个按钮对创作者自己也有用当你调参数调累了点一下随机往往能跳出思维定势看到一些意想不到的组合。我有很多满意的作品都是随机出来的然后再手动微调。实现这个功能的关键是定义好每个参数的合理范围。范围太窄随机出来都差不多范围太宽随机出来大部分都不能看。我的经验是把参数分成“核心参数”和“风格参数”两类。核心参数的范围要窄保证随机出来的东西基本可用风格参数的范围可以宽一些用来制造惊喜。比如在一个图案生成器里线条数量是核心参数范围控制在50到200之间线条的弯曲程度是风格参数范围可以从完全直线到剧烈波动。6.3 接受“大部分尝试都是失败的”这一点可能是最重要的。做 artcraft 类的项目产出和投入往往不成正比。你可能花了一整天调参数最后只有一两张图能看。这很正常。手工领域也是这样一个手艺人做十件东西可能只有两三件是满意的。关键是要把失败的作品也保留下来它们是你决策路径的一部分过一段时间回头看往往能从里面找到新的灵感。我现在的做法是每次生成的结果都自动保存按日期分文件夹。过几个月翻回去看经常会有惊喜当时觉得不好的现在看反而有意思当时觉得好的现在看发现很多问题。这种“延迟评价”能帮你更客观地看待自己的作品也能让你看到自己的进步轨迹。7. 关于工具选型的一点个人偏见工具选型这件事我的观点可能跟主流不太一样。我不推荐一上来就用最流行、功能最全的工具。原因很简单功能越多干扰越多。你会在各种花哨的特性里迷失忘了自己最初想做什么。我倾向于用“刚好够用”的工具甚至刻意用一些“不太方便”的工具因为不方便会逼你思考。比如做矢量图形我有时候会用代码直接写SVG路径而不是用图形界面拖拽。写代码慢但每一笔你都知道自己在画什么。做颜色搭配我有时候会用纸笔先画色块而不是在软件里调色轮。纸笔不能撤销所以你会更谨慎地对待每一个选择。这些“不方便”反而让创作过程更专注。当然这只是个人偏好。如果你已经对某个工具非常熟悉那就继续用不要为了“正确”而换工具。工具是手的延伸顺手最重要。我见过太多人把时间花在比较工具上而不是花在创作上。这是最大的浪费。8. 从一个小项目开始给想尝试的人一个具体起点如果你看完上面这些想动手试试我建议从这样一个项目开始生成一组“数字编织”图案。具体做法是在画布上画一组水平线每条线的Y坐标固定X方向用正弦波控制起伏正弦波的频率和振幅每条线略有不同。然后给每条线一个随机的颜色颜色从一组预设的大地色系里取。最后在画布边缘加一个渐隐遮罩。这个项目的好处是代码量不大核心逻辑几十行就能写完参数直观改一个数字就能看到明显变化效果上限高调好了真的像手工织物。你可以先跑一个最基础的版本然后按照前面说的思路逐步加入随机扰动、颜色渐变、边缘处理。整个过程可能花两三个小时但你能完整体验一遍从“能看”到“好看”的迭代过程。做完之后把代码和生成的图片都保存好。过一周再回来看你会有新的想法。这时候再改一版对比两版的差异。这种“做-放-改”的循环比一次性追求完美有效得多。我自己最满意的几个作品都是经过至少五六个版本迭代出来的。第一版往往惨不忍睹但正是那些惨不忍睹的版本铺出了通往满意结果的路。