ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

光影控制完全指南:fiziko中lightDirection与invertedLight如何一键实现黑底白线插图

光影控制完全指南:fiziko中lightDirection与invertedLight如何一键实现黑底白线插图

【免费下载链接】fiziko

MetaPost library initially written to automate some elements of black and white illustrations for a physics textbook

项目地址:https://gitcode.com/gh_mirrors/fi/fiziko
点击查看免费下载

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.mkivContext/Gin 排版系统下的配套说明
README.md项目简介与效果示例
LICENSE.mdCC-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

项目地址:https://gitcode.com/gh_mirrors/fi/fiziko
点击查看免费下载

相关推荐

上一篇:OneReward_repackaged部署避坑清单:从Hugging Face下载到ComfyUI加载的常见问题排查
下一篇:监控、日志与告警全指南:基于 Easy-Vibe 仓库的线上系统运维实战

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进