【免费下载链接】fiziko
MetaPost library initially written to automate some elements of black and white illustrations for a physics textbook
fiziko 是一个免费开源的 MetaPost 黑白插图库,最初为物理教科书插图自动化而编写,提供变宽线条、明暗球体、管道、滑轮、弹簧、绳结等现成绘图函数。本文将带你玩转它的两个"光影开关"——lightDirection(光源方向)与invertedLight(反色光照),只需几行代码即可一键实现黑底白线插图效果。
什么是 fiziko?免费的 MetaPost 黑白绘图库
fiziko 解决的是一个很具体的痛点:黑白线稿插图。没有颜色、没有渐变,只靠线条疏密和明暗关系表现立体感。它内置了一组"积木":
- 🌐
sphere.c/sphere.s:用同心圆线或点阵着色的球体 - 🌀
tube.l/tube.t/tube.s:沿任意路径绘制不同纹理的"管道" - ⚙️
pulley、wheel、spring、weight.s等物理教学常用物体 - 🪢
knotFromStrands:绳结绘制
官方文档 fiziko.tex 的开头就说明了它的用途:
automate some elements of black and white illustrations for a physics textbook (见 README.md)
而在"明暗"这件事上,整个库只依赖两个全局变量,这就是本文的主角。
两个"光影开关":lightDirection 与 invertedLight
lightDirection:一行代码改变光源方向
lightDirection是一个pair类型的全局变量,单位是弧度,描述光线从哪个方向照下来。在 fiziko.mp 中,它通过defineLightDirection(ldx, ldy)宏设置,内部会把平面方向角转换为一个 3D 光照向量,再与物体表面法线做点积,算出每个点的明暗(核心逻辑在 fiziko.mp 的normalVectorToLightness宏)。
默认值在 fiziko.mp 中设定:
defineLightDirection(-1/8pi, 1/8pi); % 默认:左上方 45° 附近的光两个分量各自控制一个方向的倾斜,改起来非常直观:
defineLightDirection(-1/8pi, 1/8pi); % 左上光(默认),高光偏左上 defineLightDirection( 0, 1/4pi); % 光从更上方来,高光更靠近顶部 defineLightDirection( 1/8pi, 1/8pi); % 右上光,高光移到右上💡 小技巧:整页插图的多个球体、管道共用同一个
lightDirection,光源方向统一后,整幅图的立体感才会协调——这也是它设计成全局变量的原因。
invertedLight:一键切换"黑底白线"
invertedLight是一个布尔变量,声明在 fiziko.mp,默认false。它的效果写在源码里就一行:把每个点的亮度取反(1 - 亮度)。
物理图像很好理解:白底黑线时,"亮面留白、暗面上线";反过来,黑底白线时,亮面该上线、暗面留黑。所以只需翻转一次明暗,原来所有球体、管道、滑轮、绳结的明暗关系自动全部反转,无需改任何绘制代码。这正是文档 fiziko.tex 中推荐的用法。
最快配置方法:三步画出黑底白线插图
第 1 步:在 MetaPost 文档开头引入库(见 fiziko.tex 的 Usage 一节):
input fiziko.mp第 2 步:(可选)按你的审美设定光源方向:
defineLightDirection(-1/8pi, 1/8pi);第 3 步:打开invertedLight,先铺黑底,再用白色画物体:
draw sphere.c(1cm); % 左边:普通白底黑线球 invertedLight := true; % 一键切换反色光照 fill ((unitsquare shifted (-1/2,-1/2)) scaled 3/2cm) shifted (3/2cm, 0) withcolor black; % 铺一块黑色背景 draw sphere.c(1cm) shifted (3/2cm, 0) withcolor white; % 右边:黑底白线球 invertedLight := false; % 画完记得切回来这段示例直接取自官方文档 fiziko.tex。注意最后一行把开关复位——invertedLight是全局状态,只影响之后绘制的物体,因此"需要反色的区域"前后各包一行即可,其余插图完全不受影响。
光影微调实用技巧
- 线条细到极限怎么办?全局变量
minStrokeWidth控制着最细线条的宽度;低于这个值时线条不再变细,而是自动变成虚线,保持单位长度墨量基本不变(详见 fiziko.tex)。想整体调整疏密感,用宏defineMinStrokeWidth(1/2pt)即可,阴影、点阵等参数会跟着联动(fiziko.mp)。 - 选哪种纹理?
sphere.c用同心圆环线着色,轮廓更"工整";sphere.s用点阵(stipples)着色,颗粒感更强。两者都吃lightDirection和invertedLight,实现见 fiziko.mp 的sphere宏。 - 阴影会跟着光走。库提供
shadowsEnabled阴影开关(fiziko.mp),投影方向直接由lightDirectionVectorXYZ推导,所以改了光源方向,阴影方向也会自动跟着变,保证画面物理上自洽。 - 算法边界要知道。官方文档提醒:低层着色算法"相当朴素",只在较简单的几何条件下效果最佳;复杂形状建议先用小图验证(fiziko.tex)。
项目文件导航
| 文件 | 内容 |
|---|---|
| fiziko.mp | 核心源码,含defineLightDirection、invertedLight、sphere、tube等全部宏 |
| fiziko.tex | 官方文档,带可编译的示例插图(luamplib环境) |
| fiziko.mkiv | Context/Gin 排版系统下的配套说明 |
| README.md | 项目简介与效果示例 |
| LICENSE.md | CC-BY-SA 4.0 开源协议 |
小结
fiziko 把"黑白插图的立体感"压缩成了两个变量:lightDirection决定光从哪里来,invertedLight决定明暗是正着来还是反着来。前者用一行defineLightDirection调方向,后者用一行invertedLight := true就能让整页插图从白底黑线变成黑底白线——对新手来说,这就是最接近"一键换风格"的 MetaPost 绘图体验了。🌓
【免费下载链接】fiziko
MetaPost library initially written to automate some elements of black and white illustrations for a physics textbook
相关推荐
agent-skills中的SQL注入防护:确保数据库安全的完整指南
agent skills中的SQL注入防护:确保数据库安全的完整指南 在当今数字化时代,数据库安全是应用程序开发的重中之重。agent skills作为一套面向
AI 技能AI 评测AI 插件开发工具告别复杂光影调整:IC-Light如何用AI一键重塑图像光影?
告别复杂光影调整:IC Light如何用AI一键重塑图像光影? 你是否还在为照片的光影效果不佳而烦恼?尝试过十几种修图软件,却始终调不出理想的氛围?IC Lig
人工智能计算机视觉媒体生成图像处理Topit常见问题解答:解决窗口置顶失败与兼容性问题
Topit常见问题解答:解决窗口置顶失败与兼容性问题 Topit是一款专为Mac用户设计的窗口置顶工具,能够帮助用户将任何应用窗口固定在屏幕最前方,提升多任务处
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考