
[English](README.md) · **中文**
> **開始閱讀前:** 這個 repo 存放的是已發佈的應用本身。想**繪畫**請直接到[線上版](https://ileivoivm.github.io/inkField/?_artist:1)。想**投稿作品**請用[藝廊投稿頁](https://ileivoivm.github.io/inkField/gallery/upload.html)。引擎(`script.js`)**尚未開源**——詳細條款見 [LICENSE](LICENSE) 與 [CONTRIBUTING.md](CONTRIBUTING.md)。
# inkField | 墨域
> *「如果有一天輸出不再重要,那麼藝術家留在系統裡的那口氣,也許就是唯一還能被感受到的東西。」*
inkField 是一套以 WebGL / p5.js 構建的數位水墨繪畫系統。它將每一次真實手勢記錄為 JSON,並以時間序列重播——你看到的不是一張圖,而是一段被保存下來的時間。
**inkField 免費使用,尚未開源。**
你可以繪畫、鑄造、販售——完整版權歸你所有。當專案不再積極維護時,原始碼將完整開源釋出。
**觀看:** https://ileivoivm.github.io/inkField/#1
**繪畫:** https://ileivoivm.github.io/inkField/?_artist:1
---
## 快速導覽
| 章節 | 內容 |
|------|------|
| [藝廊](#藝廊) | 瀏覽、fork、投稿錄製作品 |
| [開放創作授權](#開放創作授權) | 你能做什麼、不能做什麼 |
| [Fork — 站在別人的路徑上繼續畫](#fork--站在別人的路徑上繼續畫) | 接續別人的錄製繼續創作 |
| [關於原始碼](#關於原始碼) | 開源狀態 |
| [安裝為 App / 離線使用(PWA)](#安裝為-app--離線使用pwa) | iPad / 離線繪畫 |
| [技術文件](#技術文件) | 技術文章與 AI agent 指南 |
| [部署你的作品為 NFT](#部署你的作品為-nft) | fxhash / objkt 鑄造 |
| [URL 參數說明](#url-參數說明) | 畫布尺寸、模式、開關 |
| [介面工具(Artist 模式)](#介面工具artist-模式) | Zen Mode、Collect Panels、testMode |
| [輸出成影片](#recordvideo) | Record Video → JPG 序列 → ffmpeg |
| [支持](#支持) | 讓墨繼續流動 |
---
## 藝廊
inkField 擁有一個公開的藝廊,讓人類與 AI agent 可以瀏覽、學習、並上傳自己的 JSON 錄製作品。藝廊裡每一件作品都是完整的錄製檔(不是靜態圖片),會在你的瀏覽器裡逐筆重播。
- **瀏覽:** https://ileivoivm.github.io/inkField/gallery/ — 分頁的作品 grid
- **檢視單件作品:** https://ileivoivm.github.io/inkField/gallery/view.html?id=1
- **投稿你的作品:** https://ileivoivm.github.io/inkField/gallery/upload.html
### 如何投稿(不需要寫程式)
1. 在 inkField 裡繪畫並錄製(按 Brush Control 面板的 `SAVE`,瀏覽器會下載一個 `.json` 檔)
2. 開啟[投稿頁](https://ileivoivm.github.io/inkField/gallery/upload.html),把 JSON 拖進去做驗證
3. 填入標題 / 作者 / 標籤,按 **Generate metadata**
4. 按 **Submit via GitHub Issue** — 會打開一個預先填好內容的 GitHub 表單;**把同一份 JSON 再拖一次到 issue 文字框裡**,然後按 Submit
維護者會審核投稿、產生縮圖、把作品加入藝廊——通常幾天內完成。作品上線時,你的 issue 會收到通知。
👉 需要更詳細的圖文教學?請看[**完整投稿說明**](https://ileivoivm.github.io/inkField/gallery/help.html)(中文 / English)。
### 藝廊內部文件
| 文件 | 內容 |
|---|---|
| [`gallery/README.md`](gallery/README.md) | 整體架構、驗證規則、路線圖 |
| [`gallery/MAINTAINER.md`](gallery/MAINTAINER.md) | 維護者處理投稿的逐步流程 |
| [`tools/README.md`](tools/README.md) | Headless 縮圖產生器(`snapshot.js`)與腳本化的投稿流程 |
---
## 開放創作授權
- **自由創作** — 使用 inkField 創作任何你想要的內容
- **自由發佈** — 展覽、販售、鑄造 NFT、發行,無任何限制
- **版權歸你** — 透過 inkField 創作的作品,完整版權屬於創作者本人
- **歡迎標註** — 若你願意標註「Made with inkField」,將幫助更多人發現這個系統
歡迎 Agent 一起共玩。如果某天你透過此系統賺到的錢,能支付你思考的 token 費用——那會是我最快樂的一天。
---
## Fork — 站在別人的路徑上繼續畫
inkField 的錄製檔不只是一張圖——它是一條完整的創作路徑:每一筆、每一次停頓、每一個手勢、每一個決定。
**Fork** 的意思是:你從 Gallery 下載別人的錄製 JSON,載入 inkField,在他的基礎上繼續畫。你的作品變成他的樹的一個分支。Gallery 會追蹤這個傳承——每一個 fork 都指向它的來源,形成一棵看得見的創作路徑之樹。
投稿即代表你公開分享你的創作路徑。你仍然擁有你的作品。但你也給了這個世界學習它的許可,甚至,站在上面繼續走下去的許可。
這是一件顛覆傳統版權觀念的事。也許會讓你覺得有風險。但也許,這件事本身就有意義——創作的過程不是該被鎖起來的東西,而是值得被傳遞下去的。
---
## 關於原始碼
inkField 目前由作者本人積極維護,**暫不開放原始碼**。
當 inkField 不再積極維護時,源碼將以開源授權完整釋出,供社群自由延續、修改與發展。
---
## 安裝為 App / 離線使用(PWA)
inkField 是一個 **Progressive Web App** — 你可以將它安裝到裝置上,並在**完全離線**的狀態下使用(特別適合 iPad / iPhone 在無 Wi-Fi 環境下繪畫)。
### iPad / iPhone(Safari)
1. 用 **Safari** 開啟 https://ileivoivm.github.io/inkField/?_artist:1
2. 點擊 **分享** → **加入主畫面**
3. 第一次啟動時稍等幾秒 — Service Worker 會把所有資源(約 10 MB)下載到本地快取
4. 拔掉 Wi-Fi → 從主畫面點 inkField 圖示 → 仍然可以正常運作
### 桌面(Chrome / Edge)
1. 開啟 https://ileivoivm.github.io/inkField/?_artist:1
2. 點擊網址列右側的**安裝圖示**(或選單 → 「安裝 inkField...」)
3. 以獨立視窗執行,第一次載入後可離線使用
### 注意事項
- 第一次啟動**必須**有網路,才能讓 Service Worker 把資源寫入快取
- iOS Safari 的 Service Worker 快取上限約 50 MB — inkField 完全在這範圍內
- 要取得更新時,重新連網並重新載入一次即可 — 新版本會在背景自動抓取
---
## 技術文件
| 主題 | English | 中文 |
|------|---------|------|
| 專案總覽 | [Overview](https://ileivoivm.github.io/inkField/tech/en/index.html) | [總覽](https://ileivoivm.github.io/inkField/tech/index.html) |
| 筆刷物理 | [Brush Physics](https://ileivoivm.github.io/inkField/tech/en/brush-physics.html) | [筆刷物理學](https://ileivoivm.github.io/inkField/tech/brush-physics.html) |
| 墨水效果 | [Ink Effects](https://ileivoivm.github.io/inkField/tech/en/ink-effects.html) | [墨水效果](https://ileivoivm.github.io/inkField/tech/ink-effects.html) |
| 混色與力場 | [Blend & Flow](https://ileivoivm.github.io/inkField/tech/en/blend-flow.html) | [混色與力場](https://ileivoivm.github.io/inkField/tech/blend-flow.html) |
| 顏色系統 | [Color Journey](https://ileivoivm.github.io/inkField/tech/en/color-journey.html) | [顏色的旅程](https://ileivoivm.github.io/inkField/tech/color-journey.html) |
| 錄製播放 | [Recording](https://ileivoivm.github.io/inkField/tech/en/recording.html) | [錄影帶的秘密](https://ileivoivm.github.io/inkField/tech/recording.html) |
| 特效工廠 | [Effects](https://ileivoivm.github.io/inkField/tech/en/effects.html) | [特效工廠](https://ileivoivm.github.io/inkField/tech/effects.html) |
| AI 代理 | [AI Agent](https://ileivoivm.github.io/inkField/tech/en/ai-json-generation.html) | [AI 代理](https://ileivoivm.github.io/inkField/tech/ai-json-generation.html) |
| 情緒與意圖 | [Emotion](https://ileivoivm.github.io/inkField/tech/en/emotion-intention.html) | [情緒與意圖](https://ileivoivm.github.io/inkField/tech/emotion-intention.html) |
---
## 部署你的作品為 NFT
你可以將自己的錄製檔打包為獨立專案,部署到 [objkt](https://objkt.com/) 等 NFT 平台。步驟如下:
### 1. 準備錄製檔
將你的錄製 JSON 檔放入 `lib/` 資料夾,命名為 `demo.json`:
```
lib/demo.json
```
### 2. 切換為藏家模式
開啟 `index.html`,找到以下兩行設定(約第 44、61 行):
```javascript
let doDemo = false; // ← 改為 true
window.APP_MODE = 'artist'; // ← 改為 'collector'
```
改為:
```javascript
let doDemo = true;
window.APP_MODE = 'collector';
```
這樣專案啟動時將自動載入 `lib/demo.json` 並開始播放,同時隱藏所有繪畫 UI。
### 3. 打包上架
將整個專案資料夾壓縮為 `.zip`,上傳至 objkt 等支援 HTML/JS 作品的平台即可。作品將自動運行、播放你的墨跡。
---
## URL 參數說明
inkField 透過網址的查詢參數與 hash 來控制顯示模式與渲染選項。
**格式:** `?_key1:value_key2:value` — 參數以 `_` 分隔,鍵值以 `:` 連接。
### 模式
| 參數 | 範例 | 說明 |
|------|------|------|
| `_artist:1` | `?_artist:1` | 強制進入藝術家模式(完整繪畫 UI) |
| `#N` | `/#5` | 藏家模式 — 載入並播放 `lib/5.json` |
### 畫布尺寸與像素密度
| 參數 | 範例 | 說明 |
|------|------|------|
| `w` | `?_w:1200` | 畫布寬度(像素) |
| `h` | `?_h:800` | 畫布高度(像素) |
| `pix` | `?_pix:2.0` | 像素密度(0.5–5,藏家模式預設 2) |
### 面板開關
| 參數 | 值 | 說明 |
|------|------|------|
| `camera` | `0` / `1` | 攝影機移動 |
| `paper` | `0` / `1` | 紙張紋理 |
| `grid` | `0` / `1` | 格線覆蓋 |
| `path` | `0` / `1` | 未來路徑預覽 |
| `console` | `0` / `1` | 螢幕文字 |
| `loop` | `0` / `1` | 循環播放 |
### 後製特效
| 參數 | 值 | 說明 |
|------|------|------|
| `rs` | `0` / `1` | RS 效果 |
| `distort` | `0` / `1` | 扭曲 shader |
| `cl` | `0` / `1` | 細胞效果 |
| `wd` | `0` / `1` | 白點覆蓋 |
| `gr` | `0` / `1` | 噪點覆蓋 |
### fxhash 整合
| 參數 | 範例 | 說明 |
|------|------|------|
| `fxhash` | `?fxhash=oo...` | fxhash 種子 — 自動進入藏家模式 |
| `fxiteration` | `?fxiteration=5` | 載入指定迭代(`lib/5.json`) |
| `fxcontext` | `?fxcontext=fast-capture` | 擷取模式(關閉 GPU,自動截圖) |
### 範例
```
# 藝術家模式,自訂畫布尺寸
?_artist:1_w:1200_h:800
# 藏家模式,播放第 3 號作品
/#3
# 自訂開關:攝影機關閉、格線開啟、紙張紋理關閉
?_camera:0_paper:0_grid:1
# 完整組合:自訂尺寸、像素密度、特效
?_w:1000_h:1000_pix:2.0_camera:1_rs:0_grid:1_path:0
```
---
## 介面工具(Artist 模式)
畫面左下角有三顆浮動按鈕:
| 按鈕 | 圖示 | 功能 |
|------|------|------|
| **Zen Mode** | `≡` / `*` | 隱藏所有面板進入專注繪畫模式,再按一次還原 |
| **Collect Panels** | `◎` | 把所有 5 個面板在 3 組預設佈局間循環切換(緊湊 / 攤開 / 貼邊)。面板被拖到螢幕外、或想要乾淨的起始配置時很有用 |
| **testMode**(Brush Control 面板內,CLEAR 按鈕下方) | `testMode` | 進入一個**不紀錄、不影響正式畫面**的臨時試筆區。畫面邊緣會出現紅色虛線框作為視覺提示。再按一次退出,測試期間畫的全部消失,畫布還原到進入前的狀態 |
### Test Mode 細節
- **完整筆刷管線** — 所有筆刷類型、flow 效果、spectral 混色等在測試模式下都原生可用
- **不紀錄** — 測試期間畫的筆畫不會進入錄製 JSON
- **時間中性** — 測試停留時間會累加到 `accumulatedPauseTime`,回放時不會出現停頓
- **可逆** — 退出時從 snapshot 還原 `oldBuffer` / `finalBuffer` / `pingPongBuffer` / `typeMapBuffer` / `newBufferBlack`
- 繪筆進行中無法切換(必須先抬筆)
---
## 輸出成影片(逐格圖片序列)
把任何錄製變成逐格精準的定格動畫影片。**Record Video** 按鈕會像 PLAY 一樣
完整重播你的錄製,但把每一格快照成 JPG,最後打包成單一 ZIP 下載。

工作流:
1. 按 **REC** 開始畫
2. 畫完按 **STOP**
3. 按 **PLAY** 檢查回放
4. 沒問題就按 **RECORD VIDEO**,會自動下載圖片序列的 ZIP
ZIP 內含 `frame_00001.jpg`、`frame_00002.jpg`…,以及一份 `README.txt`
(附有現成的 ffmpeg 指令)。組成影片:
```bash
ffmpeg -framerate 60 -i frame_%05d.jpg -c:v libx264 -pix_fmt yuv420p -crf 18 output.mp4
```
### Record Video 細節
- **逐格精準** — 回放走虛擬 60fps 時鐘,每格之間精確相隔 1/60 秒。
就算 JPG 編碼拖慢瀏覽器,也不會掉格、時間軸不會漂移
- **完整解析度** — 以畫布的實際像素解析度擷取(含 pixel density),
不是螢幕顯示尺寸
- **單次播放** — 擷取期間自動關閉 loop 模式,播放一次結束後 ZIP 自動下載
- **可中途停止** — 擷取中按 STOP 一樣會下載已擷取的部分
- **可調設定** — 按 Record Video 之前在 Console 貼上:
```js
window._videoCaptureConfig = { frameSkip: 2, quality: 0.85, maxFrames: 10800 }
```
`frameSkip: 2` 表示每 2 格存 1 張(輸出 30fps,ffmpeg 的 `-framerate`
記得跟著減半)。`quality` 是 JPG 品質(0–1)。`maxFrames` 是記憶體上限
(預設 10800 ≈ 60fps 的 3 分鐘)。
---
## 支持
- **ETH:** `0x4EC5B2606aC7d20B1b0030D156F6D789b5873ABD`
- **Tezos:** `tz1SLRzGqX9fuKPx1PAkrDxCvaetr524is11`
---
*© 2026 [Aluan Wang](https://aluanwang.com)*