简单聊聊 fabric.js Canvas 的 viewportTransform

本文节选自正在编写的 fabritor 手册


viewportTransform 是 Canvas 的一个属性,用于进行空间变换,将一个点从一个坐标系转换到另一个坐标系,形式是一个6个值的数组:

js 复制代码
[
 a, c, e,
 b, d, f
]

a 和 d 控制了缩放,b 和 c 控制了倾斜,e 和 f 控制了平移。

写成上述类似矩阵的形式,感官上更好理解一些,我们逐个来看:

缩放

变换公式如下:
x ′ y ′ = a 0 0 d x y \begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} a&0 \\ 0&d \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} x′y′=a00dxy

不知道你们还记不记得矩阵的乘法, x 和 y 分别乘以一个系数,显然可以达到缩放的效果。这就是数组中 a 和 d 两个参数为何可以控制缩放的原因。

比如,我们要实现对象按照 y 轴对称,其实就是就 x 的值乘以 -1,y 值保持不变:
x ′ y ′ = − 1 0 0 1 x y \begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} -1&0 \\ 0&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} x′y′=−1001xy

倾斜

我们看到上述缩放矩阵还空着两个值,那两个值就是控制倾斜的,也就是 b 和 c:

想象一个位于0,0点,宽高为1的矩形,四个点分别为:0,0 0,1 1,01,1, 此时我们将 c 的值置为 0.5,那么四个点变换为: 0,0 1.5,1 1,0 1.5,1。可以在图上画一下,你得到了一个倾斜的矩形!
x ′ y ′ = 1 c b 1 x y \begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} 1&c \\ b&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} x′y′=1bc1xy

平移

也就是数组内 e 和 f,当 x 和 y 分别加上一个值时,就是平移的效果。
x ′ y ′ = 1 0 0 1 x y + e f \begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} 1&0 \\ 0&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} + \begin{bmatrix} e\\f \end{bmatrix} x′y′=1001xy+ef


关于更多 fabric.js 变换的内容可以参考官方文档Using transformations, Introduction to Fabric.js Part 6

另外,要详细了解线性变换的内容,可以参考 B 站视频GAMES101-现代计算机图形学入门-闫令琪,讲的深入浅出,一门优秀的计算机图形学入门教程。

相关推荐
dsyyyyy110135 分钟前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
默_笙42 分钟前
🏝 Docker 就是"房地产开发":从施工图纸到小区物业的容器化指南
前端·javascript
计算机魔术师44 分钟前
Rohan Paul 谈用时间跨度衡量智能体能力,并引用 OpenAI 自动化研究实习生里程碑
前端
kyriewen1 小时前
我手写了个极简版 React Router——才搞懂 v6 为什么砍了这么多 API
前端·javascript·程序员
a1117761 小时前
Shirone 二次元博客主题 开源
前端·开源
IT_陈寒1 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端
掘金酱1 小时前
【社区公告】致每一位掘友:关于这次调整, 想再说几句
前端·人工智能
CoderLiu1 小时前
程序化工具调用(PTC)与动态工作流引擎:深入大模型工具调用的架构演进与实践
前端·人工智能·后端
码农胖大海1 小时前
我的第一个产品,只有一段提示词
前端·ai编程·产品
邋遢道2 小时前
# 企业级 Agent 从 0 到 1(二):技术选型与最小骨架
前端·chrome