# Emakiで絵を描くAIへ ユーザーが指定した題材を、新しい作品として描いてください。ソフトのソースコードは変更せず、用意された画材を操作します。このページから必要な仕様へ進めます。過去の作品や会話履歴を読む必要はありません。 製品名はEmakiです。JSONの`astra-sketch-1`は既存データとの互換性を保つ形式IDなので、そのまま使います。 ## 同じ画面の紙に描く(推奨) ガイドを読んだら `/` を開き、`window.emakiStudio` が利用可能になるまで待ちます。白紙から制作・比較・保存まで同じ画面を使えます。以下の操作はトップページで実行します。 ```js const state = emakiStudio.observe(); const scene = emakiStudio.scene(); // 現在の文書のコピー // scene.layers に自分の brush / wait を追加・修正する。 const trial = await emakiStudio.preview(scene, {expectedRevision: state.revision}); // 画面の試し描きを実際に見て判断する。 // 採用する場合だけ: emakiStudio.accept(trial.candidateId, {expectedRevision: trial.baseRevision}); await emakiStudio.exportPNG(); emakiStudio.exportJSON(); ``` `observe()` は文書ID、revision、表示がcurrent/candidate/replayのどれか、画像、計算中か、書き込み可能かを返します。`scene()` は採用済みの作画JSONです。`preview` は試し描きで、保存作品を変更しません。`accept` で採用します。`undo({expectedRevision})` は直前の採用・白紙化を一段階戻せます。`newDocument({expectedRevision})` は新しい白紙を作ります。既存作品がある場合は先に書き出してください。同じoriginの別タブは閲覧のみです。 PNG/JSON書き出しは常に採用済みの作品です。試し描きや再生途中を完成画として保存しません。再生ボタンは保存された筆順と材料時間を4倍速で観察し、文書の状態を変えません。画面操作しか使えないAIは「AIに指示を渡す」のJSON欄、試し描き、採用、保存ボタンを使えます。 `window.emaki` はローカル専用の旧CPU動作テストです。本番にはありません。この紙には `emakiStudio` を使ってください。外部HTTPサーバーや内蔵LLMはありません。 ## 独立canvasを使う低水準の入口 このサイトと同じoriginのJavaScript対応ブラウザで、以下のモジュールを使えます。サーバーへの作画POST APIはありません。 ```js const {validateScene} = await import('/sketch/model.js'); const {createScenePainter} = await import('/sketch/render.js'); const scene = { version: 'astra-sketch-1', title: '自分の作品名', seed: 12345, width: 1000, height: 1200, material: {model: 'paper-brush-v3', resolution: 384, roughness: .64, absorbency: .42}, layers: [] }; // layersへ自分で考えた筆と待機を追加してから検証する。 const checked = validateScene(scene); const canvas = document.createElement('canvas'); document.body.append(canvas); // 独立した紙。既存の保存作品は変更しない。 const painter = createScenePainter(checked); // nは経過秒でなく、先頭から実行するbrush/wait命令の個数。 const n = checked.layers.flatMap(layer => layer.marks).length; painter.paintThrough(n, canvas); const png = canvas.toDataURL('image/png'); const replayJSON = JSON.stringify(checked, null, 2); ``` 題材に合わせて構図・筆順・色を自分で決めてください。`layers`の各要素は`{id, intent, marks}`。`id`は重複させず、`intent`は人間が見る短い工程字幕です。 ## 基本の画材 | 操作 | 指定 | |---|---| | 色筆 | `{type:'brush', points:[[x,y],...], width, color:'#336699', opacity, water, duration}` | | 水筆 | 同じbrushで`opacity:0`、`water`を指定 | | 待機 | `{type:'wait', seconds:5}` | | 筆圧 | brushの`pressure:[...]`。pointsと同じ個数、各値.05〜1 | | 粒状化の強さ | brushの`granulation`を0〜1で指定 | | 乾燥停止の補助 | layerに`environment:{drying:'hold'}`。省略時は通常乾燥 | 座標は紙の左上が[0,0]、右下が[1,1]。pointsは2〜256点の筆の中心経路で、塗りつぶす輪郭ではありません。widthは紙幅に対する割合.0001〜.15。opacityとwaterは0〜1、durationは1筆の材料時間.1〜20、waitは.1〜180秒、全体の材料時間は600秒以下。画面のピクセル数を増やすだけでは材料計算は細かくなりません。 水筆、先濡らし、重ね塗り、乾燥待ち、湿った筆でのなじませを使えます。`water:0`は紙を乾かす命令ではなく、白色は消しゴムではありません。holdは紙全体の吸収・蒸発・定着を止めますが、水と色の移動は続きます。実物を近似した未校正の画材です。 詳しい値と追加機能は[スキーマ](schema.json)と[現在の能力表](knowledge/capabilities.md)で確認してください。有限の筆残量・姿勢・再湿潤などの仕様へも能力表から進めます。WebGL2のFilmは別の任意実験で、通常の作品には上記v3から始められます。 ## 描きながら判断する 一度に完成させず、小さい試し塗りと数段階の途中画像を実際に見て、筆順・水・色・待つ時間を調整してください。数値や画像URLだけを見て画質を判定しないでください。 同じpainterは前向きに進めます。途中へ戻る、すでに描いた筆を直す、sceneに筆を追加する場合は、修正JSONから新しいpainterを作って再描画します。採用前の案も別のJSONとして残せます。`paintProgress(命令番号+筆の進捗, canvas)`で筆の途中も観察できます。 新しい絵は独立canvasとファイルへ保存し、既存のIndexedDBや保存作品を上書きしないでください。作画にはbrush/waitのみを使い、形状塗りつぶし、任意マスク、写真の貼り付け、描画後のぼかし・ノイズ合成、画像生成AIの代用は使いません。供給一定の`constant-v1`は廃止済みです。 ## 完成物 完成PNG、編集・再生できるscene JSON、短い制作メモを保存してユーザーへ渡してください。PNGのdata URLやJSON文字列を返すだけでなく、実際に開けるファイルにします。JSONのlayers/marks順が制作手順です。制作過程の動画が必要なら[動画モジュール](video.js)を利用できます。既存作品への採用や外部公開は行わないでください。