筆刷動態承載著什麼?
在 InkField 的筆刷物理模型中,每筆的動態數據(速度、加速度、粗細變化)都可以被記錄與分析。這一章探討如何從這些數據讀出創作者的情緒與意圖。
實驗 1:猶豫偵測 — 誰畫得比較猶豫?
兩份錄製檔各有 4 條垂直筆觸。僅從 JSON 數據(時間戳 + 座標),能否判斷哪位畫者比較猶豫?
| 錄製 A(猶豫) | 錄製 B(果斷) | |||||
|---|---|---|---|---|---|---|
| 筆 | 起手 | 中段 | 收尾 | 起手 | 中段 | 收尾 |
| 1 | 0.76 | 1.81 | 0.19 | 2.62 | 1.39 | 0.48 |
| 2 | 1.28 | 1.32 | 0.25 | 0.66 | 1.32 | 0.54 |
| 3 | 1.30 | 1.10 | 1.73 | 1.09 | 1.43 | 0.32 |
| 4 | 1.26 | 0.81 | 0.54 | 1.41 | 0.86 | 0.28 |
1. 起手速度慢。A 的第一筆起手只有 0.76 px/ms,而 B 的第一筆起手達 2.62 — 差距 3.4 倍。猶豫的人在落筆瞬間缺乏決心,需要「暖身」才加速。
2. 路徑更彎(彎曲度 1.084 vs 1.050)。彎曲度越高代表筆觸越偏離直線。A 畫者的手在移動過程中持續微調方向 — 這是不確定路徑時的特徵。B 的 Stroke 2 和 4 彎曲度僅 1.03,幾乎是直線。
3. 方向選擇的線索。B 有兩筆是「由下往上」畫的,這種反慣性的方向選擇反而代表自信 — 畫者很清楚自己要去哪裡,不需要依賴重力慣性。A 的四筆全部由上往下,是最保守的選擇。
實驗 2:加速度分析 — 一筆裡的故事
一筆持續 6 秒的單一筆觸,從左上角墨團到右下角甩尾。透過速度和加速度,還原畫者的意圖。
| 階段 | 時間 | 持續 | 速度 | 行為描述 |
|---|---|---|---|---|
| 1. 起筆描圓 | 0 – 0.9s | 0.9s | 0.06 – 0.15 | 在起點附近緩慢移動,畫出墨團上半弧。手腕帶動筆桿做小幅度旋轉。 |
| 2. 第一次爆發 | 0.9 – 1.2s | 0.3s | 峰值 0.96 | 突然加速衝出弧線 — 墨團下半部的快速劃過。加速度達 0.012 px/ms²。 |
| 3. 長停頓 | 1.2 – 2.0s | 0.8s | ≈ 0 | 幾乎完全靜止 400ms。這是決策點 — 畫者在猶豫下一步往哪走。 |
| 4. 走走停停 | 2.0 – 5.4s | 3.4s | 0 – 0.9 交替 | 5 次停頓 + 8 次爆發交替。在左上區域反覆打圈,形成密集墨跡。佔全程 56% 時間。 |
| 5. 最終甩尾 | 5.4 – 6.0s | 0.6s | 峰值 14.1 | 果斷往右下角甩出,速度是慢速區的 40 倍。筆觸因高速而變細。 |
左上角的墨團不是「一團亂畫」— 它是 3.4 秒的走走停停,畫者在用身體思考構圖。每次短暫的爆發(0.5-0.9 px/ms)是嘗試性的探索,每次停頓是重新評估。
最關鍵的轉折在 5.4 秒:畫者突然做出決定,以 14.1 px/ms 的峰值速度甩向右下角。這不是猶豫 — 這是蓄勢後的釋放。前面 90% 的時間都在積累這最後 10% 的果斷。
方法論:從 JSON 讀取繪畫意圖
| 指標 | 計算方式 | 代表意義 |
|---|---|---|
| 瞬時速度 | 相鄰兩點距離 ÷ 時間差 | 畫者當下的果斷程度 |
| 加速度 | 相鄰速度差 ÷ 時間差 | 意圖的變化率 — 突然加速 = 做出決定 |
| 彎曲度 | 總路徑 ÷ 直線距離 | = 1.0 表示完全直線,越高越迂迴 |
| 方向反轉 | 相鄰向量內積 < 0 的次數 | 猶豫或刻意的方向改變 |
| 速度剖面 | 筆觸分三段的平均速度 | 起手慢 = 猶豫,收尾慢 = 控制 |
| 慢速區 | 速度 < 0.1 px/ms 持續 > 150ms 的區間(5-point smoothing) | 停頓思考的位置與頻率 |
同一個人在不同心理狀態下,筆觸速度分佈完全不同。猶豫時起手慢、路徑彎;自信時起手快、路徑直。而在同一筆畫中,速度的「斷層」(突然從慢到快)往往標記著一個決策瞬間 — 從思考切換到行動的臨界點。
實驗 3:同一動作的五種情緒
新增於 2026-03-11 — 資料來源:drawing-recording-2026-03-11T03-49-49.json
一個人用相同的筆刷設定(bm=1, us=0, bs=2, pr=0),畫了五條水平橫線。參數完全一樣,差異全部來自手的速度和暫停。同一個動作,五種情緒。
速度熱力圖
紅 = 快、黃 = 中、綠/藍 = 慢、黑點 = 起筆位置(與 Ch2、Ch3 相同的視覺化方式)
速度時間線
橫軸 = 時間進程(含五次筆觸及間隔),黃色帶 = 暫停區間
▁ 近停 ▂ 極慢 ▃ 慢 ▄ 中 ▅ 快 ▆ 很快 █ 爆發 — 每格 = 筆觸 10% 進程
| 筆觸 | 速度指紋 | 時長 | 暫停 | 速度方差 | 慢速佔比 |
|---|---|---|---|---|---|
| S0 | ▁▃▁▁▁▁▁▁▂▁ | 2.8s | 3 次 | 0.22 | 69% |
| S1 | ▃▂▁▁▁▁▁▁▁▁ | 2.1s | 2 次 | 0.64 | 66% |
| S2 | ▁▁▃▁▁▁▃▁▁▂ | 4.2s | 6 次 | 0.11 | 65% |
| S3 | ▃▁▁▁▁▁▁▂▂▁ | 3.0s | 3 次 | 0.32 | 75% |
| S4 | ▁▃▁▁▁▁▁▁▁▁ | 2.3s | 2 次 | 1.68 | 58% |
| 項目 | 數值 |
|---|---|
| 資料來源 | drawing-recording-2026-03-11T03-49-49.json |
| 分析腳本 | extract-speed-data.py |
| Smoothing window | 5-point (W=2) |
| Pause threshold | speed < 0.1 px/ms 且持續 > 150ms |
| 慢速定義 | speed < 0.1 px/ms |
執行 python extract-speed-data.py <json> 可重現上方表格數值。JS 視覺化 (computeSpeeds) 使用相同參數。
逐筆解讀
起筆中速(0.42),前 20% 加速到 2.7 px/ms,然後中段急降,50% 處暫停 201ms。70-80% 位置再次爆發(+0.75 加速度)。速度剖面:start=0.42 → mid=0.07 → end=0.27。
中段的飛白不是速度甩開的,是暫停造成的。情緒弧線:衝出去 → 停下來評估 → 決定繼續。
起筆最猛(1.01),7-8% 處爆發到 6.6 px/ms,加速度 +2.59 — 五條中最強的開頭。然後急速衰減,後 60% 幾乎靜止,末尾 400ms 長停頓。速度剖面:start=1.01 → mid=0.06 → end=0.02。
左端的濃墨團不是壓得重停留久,是速度爆發後的慣性堆積。前 20% 用完了所有動能,方差 0.64 反映極端的不均勻。像是鼓起勇氣說出第一句話,然後沒力了。
五條裡最長(4.2 秒),暫停最多(6 次),但方差最低(0.11)。速度像波浪:▁▁▃▁▁▁▃▁▁▂ — 推一下、停、推一下、停。暫停分散在全程多個位置,幾乎均勻覆蓋。
看起來「完整」是因為暫停均勻且短暫。不是恐懼的猶豫,是太極拳的推手 — 推、吸、推、吸。情緒是最平的,但不是「沒有情緒」,而是最有控制的情緒。
起筆快(爆發到 5.4),但 47% 處停了 850ms,54% 處又停了 1017ms — 超過一秒的完全靜止。慢速佔比 75%,五條中最高。然後 76% 處再爆發(+0.59),虎頭蛇尾收場。
中段的碎裂感不是壓力輕,是兩次長停頓把連續性打碎了。第一次 850ms 是猶豫,第二次 1017ms 是重新做決定。跟 S2 的 7 次均勻短停完全不同 — 同樣是「停」,分散停是韻律,集中停是掙扎。
方差 1.68 — 是 S2 的 15 倍。13-17% 處有一個極端速度爆發,加速度遠超其他筆。57% 處停了 683ms,然後 62% 再次發力。速度剖面:start=1.12 → mid=0.18 → end=0.24。
兩頭重中間輕的啞鈴結構。17% 的甩鞭是蓄勢後的釋放(類似 Ch3 的「最終甩尾」),57% 的靜止是另一個決策點。這條有最完整的四段敘事:蓄、放、靜、再放。
新指標:速度方差與暫停分佈
| 指標 | 計算方式 | 代表意義 |
|---|---|---|
| 速度方差 | 各點速度與均值的離散程度 | 情緒張力 — 低=平穩,高=戲劇化 |
| 暫停分佈 | 暫停位置在筆觸進程中的散佈模式 | 均勻散佈=韻律,集中在中段=猶豫決策 |
| 速度指紋 | 筆觸分 10 段的速度等級序列 | 一眼辨認情緒類型的視覺模式 |
S2 暫停 6 次 → 韻律。S3 暫停 3 次 → 猶豫。差異不在「停了幾次」,在於暫停如何分佈。均勻散佈的暫停像呼吸,集中在中段的暫停像掙扎。單看暫停次數(Ch4 的「慢速區」指標)會誤判 — S2 的 6 次暫停看似比 S3 的 3 次更猶豫,但實際上 S2 是五條中最有控制感的一筆。
這五條橫線的筆刷參數完全相同(bm=1, us=0, bs=2, pr=0),路徑幾乎平行(sinuosity 1.038-1.044),消除了構圖和效果的干擾。所有差異都來自手的動態 — 速度、暫停、加速度。這是研究筆刷情緒最乾淨的實驗設計:固定一切,只讓情緒流動。
構圖直覺 — 邊界、對稱與落筆順序
前面幾章聚焦在「一筆畫出什麼情緒」。但在畫第一筆之前,人類已經在做一件更基礎的事:決定哪裡該畫。
以下實驗:在 800×800 畫布上,依序在左上、左下、右下、右上、中間各點一筆。五個點,沒有構圖規則,完全靠直覺。
落筆順序:左上 → 左下 → 右下 → 右上 → 中間
6.1 邊界距離圖
每個點到畫布四邊的距離,揭示了畫者對空間的「感覺」精度。
| 筆觸 | 質心 | 左 | 右 | 上 | 下 | 最近邊 |
|---|---|---|---|---|---|---|
| S0 左上 | (141, 127) | 141 | 659 | 127 | 673 | 上 127px |
| S1 左下 | (127, 689) | 127 | 673 | 689 | 111 | 下 111px |
| S2 右下 | (705, 690) | 705 | 95 | 690 | 110 | 右 95px |
| S3 右上 | (704, 119) | 704 | 96 | 119 | 681 | 右 96px |
| S4 中間 | (401, 408) | 401 | 399 | 408 | 392 | 下 392px |
左邊兩點到左邊緣約 127-141px,右邊兩點到右邊緣約 95-96px。差距約 35px — 這是右手慣用手的特徵:右手更容易往右邊伸展,自然在右側留較少邊距。
6.2 落筆路徑
五個點的連線順序形成一個特殊的路徑:逆時鐘 U 型 + 對角線收束。
前四筆走了一個完整的逆時鐘 U 型(左上→左下→右下→右上),建立了矩形邊界。第五筆從右上角切入中心 — 136° 對角線,像是「確認中心在哪裡」的最後一擊。這不是數學計算的結果,是身體記憶。
6.3 構圖範式比較
把五個點放到三分法和黃金比例的格線上比較:
| 筆觸 | 到三分法最近交點 | 到黃金比例最近交點 | 判定 |
|---|---|---|---|
| S0 左上 | 188 px | 243 px | 都不符合 |
| S1 左下 | 209 px | 264 px | 都不符合 |
| S2 右下 | 232 px | 287 px | 都不符合 |
| S3 右上 | 226 px | 281 px | 都不符合 |
| S4 中間 | 182 px | 127 px | 接近黃金比例 |
五個點到三分法交點的距離全部超過 180px — 畫布寬度的 23%。人類的空間直覺走的是「四角錨定」策略:先用四角建立矩形領域,再直覺找中心。這比三分法更原始,也更穩定 — 中心點偏差僅 17px(畫布的 2.1%)。
6.4 對稱性與覆蓋率
上下偏差 86px,左右偏差 107px。人類對垂直方向的空間感比水平方向更精準 — 可能因為重力感讓我們對「上下」的距離更敏感。覆蓋率 72%×71% 幾乎是正方形,說明畫者對畫布的比例感相當準確。
6.5 新指標定義
| 指標 | 定義 | 本例數值 | 意義 |
|---|---|---|---|
| 邊界距離 | 質心到畫布四邊的 px 距離 | 見 §6.1 | 空間感的精度 — 邊距越均勻,構圖越穩定 |
| 覆蓋率 | (max−min) / canvas 的 xy 比例 | 72%×71% | 畫者「使用」了多少畫布 |
| 中心偏差 | 幾何中心到真實中心的距離 | 17px (2.1%) | 直覺找中心的精度 |
| 路徑角度 | 相鄰質心的方向角序列 | 91°→0°→−90°→136° | 落筆策略:U型、Z型、隨機… |
| 對稱偏差 | 鏡像配對的平均距離 | LR=107 TB=86 | 構圖的平衡感 |
6.6 進階實驗:呼吸空間
五點構圖證明了人類能直覺定位邊界與中心。但真實的畫作不會只有等大的點 — 筆觸有大有小,而且大小之間的比例關係決定了畫面是否舒服。
以下實驗:在 800×800 畫布上,自由畫 7 個大小不同的圓。沒有規則,只憑感覺。
落筆順序:S0 左上小圓 → S1 大圓 → S2 右中圓 → S3 左中圓 → S4 右上點 → S5 大圓內小圓 → S6 中上小圓
6.7 面積層級與呼吸比
七個圓自然形成了四個尺寸層級:
| 層級 | 筆觸 | 等效半徑 | 面積 | 呼吸比 |
|---|---|---|---|---|
| 大 | S1 大圓 | ≈208px | 135,673px² | 0.5× 被包圍 |
| 中 | S2、S3 | ≈62px | ≈12,080px² | 2.0×、5.1× |
| 小 | S0、S5 | ≈31-34px | ≈3,000-3,600px² | 6.3×、2.9× |
| 微 | S4、S6 | ≈10-21px | ≈300-1,400px² | 12.2×、9.3× |
圓越小,呼吸比越大 — S4(微點)的呼吸比高達 12.2,意味著它周圍的空白是自身大小的 12 倍。大圓 S1 的呼吸比只有 0.5,因為 S5 直接畫在它裡面。這不是巧合:小的東西需要更多留白才不會窒息,大的東西可以容納其他元素。
6.8 包含關係與落筆策略
落筆順序揭示了「感覺空間」的過程:
- S0 — 試探:先畫一個小圓(面積排名 5/7),在左上角試探畫布
- S1 — 主體:緊接著畫最大的圓(排名 1/7),佔據畫布 21%,建立視覺重心
- S2、S3 — 平衡:兩個中等圓(面積幾乎相等:12,080 vs 12,084px²),分別放在大圓的右上方和左方
- S4 — 點綴:最小的點(排名 7/7),放在 S2 旁邊作為衛星
- S5 — 內部呼應:在大圓內部畫一個小圓,建立包含關係
- S6 — 填補:最後在上方空白區補一個小圓,平衡畫面上半部
第二筆就畫了最大的圓 — 不是從小到大漸進,而是先用一個「試探」小筆確認手感,立刻投入主體。之後所有筆觸都在回應這個主體:中圓做平衡、小圓做點綴、內部小圓做呼應。兩個中圓的面積差異僅 4px²(0.03%),說明人類對「等量平衡」的直覺精度極高。
6.9 面積比例與黃金關係
相鄰層級之間的面積比:
| 比較 | 面積比 | 半徑比 | 接近 |
|---|---|---|---|
| 大 / 中 | 11.2× | 3.4× | ≈ φ⁵ (11.09) |
| 中 / 小 | 3.3-3.9× | 1.8-2.0× | ≈ φ² (2.62) |
| 小 / 微 | 2.2-9.9× | 1.5-3.1× | 混合 |
| 大圓 / 其餘總和 | 4.2× | — | ≈ φ³ (4.24) |
大圓與其餘六圓面積總和的比值是 4.16 — 而 φ³ = 4.236,誤差僅 1.8%。大圓與中圓的面積比 11.2 ≈ φ⁵ (11.09),誤差 1%。這暗示人類的面積直覺不是線性的「大一倍、小一倍」,而是以某種指數級距在運作 — 黃金比例的冪次可能就是那個內建的比例尺。
工具:速度與構圖分析腳本
以下 Python 腳本可從 InkField JSON 錄製檔中提取筆觸座標、計算速度統計與構圖分析,並輸出可嵌入本頁的 JavaScript 資料。其他 AI agent 可以使用這些工具來分析新的錄製檔。
下載腳本: extract-speed-data.py | extract-composition-data.py
下載資料: Ch5 五條橫線 JSON | Ch6 五點構圖 JSON | Ch6 七圓構圖 JSON
# 基本用法:提取筆觸並產生 JS 資料 python extract-speed-data.py recording.json # 指定變數名稱 python extract-speed-data.py recording.json DATA_MY_STROKES # 輸出範例: # S0: 166 pts | 2.8s | pauses=3 | var=0.22 | slow=69% | ▁▃▁▁▁▁▁▁▂▁ # S1: 126 pts | 2.1s | pauses=2 | var=0.64 | slow=66% | ▃▂▁▁▁▁▁▁▁▁ # ... # === JavaScript data (DATA_XXX) === # const DATA_XXX=[...];
- 執行腳本取得
const DATA_XXX=[...];輸出 - 在本頁
<script>區塊中加入資料(放在DATA_FLOWER之後) - 在新章節的 HTML 中加入
<canvas>元素 - 在
renderAll()中加入drawPathHeat('canvasId', DATA_XXX, w, h)和drawSpeedTimeline('canvasId', DATA_XXX, w, h)
| 函式 | 用途 | 參數 |
|---|---|---|
drawPathHeat(canvasId, strokes, w, h) | 路徑速度熱力圖 | 紅=快 綠/藍=慢 |
drawSpeedTimeline(canvasId, strokes, w, h) | 速度時間線 | 黃色帶=暫停區間 |
drawAccelChart(canvasId, strokes, w, h) | 加速度柱狀圖 | 紅=加速 藍=減速 |
computeSpeeds(pts) | 計算平滑速度陣列 | 回傳 [{speed, t}] |
drawBoundaryMap(canvasId, comp) | 邊界距離圖 | 質心到四邊的虛線 |
drawOrderPath(canvasId, comp) | 落筆路徑圖 | 漸變色箭頭+角度 |
drawCompGrid(canvasId, comp) | 構圖格線比較 | 三分法+黃金比例+實際點 |