PixiJS 流の 2D 描画エンジンです。図形のシーングラフを組み立て、実行時に選んだ三つのバックエンド(Canvas2D、WebGL、WebGPU)のどれかで描きます。
エンジンは層になっています。Application(ライフサイクルと描画ループ)、その下に Renderer(バックエンド)、そして Container(まとまり)から Graphics(描けるもの)へと続くシーングラフです。ノードを app.stage に足すと、レンダラーがそれを描きます。
ブラウザー専用です。 ranuts/visual には本物の HTMLCanvasElement と、GPU または Canvas のコンテキストが要ります。Node では動きません。
import { Application, Graphics, Container } from 'ranuts/visual';
アプリケーションを作り、塗りと線をもつ長方形と円を描いて、描画ループを回します。
import { Application, Graphics, RENDERER_TYPE } from 'ranuts/visual';
const view = document.querySelector('canvas');
// Application.create は非同期です。WebGPU バックエンドはデバイスの初期化を
// 非同期で行うため、最初の描画より前に終わっている必要があります。
const app = await Application.create({
view,
prefer: RENDERER_TYPE.CANVAS, // CANVAS | WEB_GL | WEB_GPU
backgroundColor: '#1e1e1e',
});
// 長方形。赤の塗りに 4px の青い線。
const rect = new Graphics();
rect.beginFill('#ff0000');
rect.lineStyle(4, '#0000ff');
rect.drawRect(20, 20, 160, 100);
rect.endFill();
// 円。
const circle = new Graphics();
circle.beginFill('#00cc88', 0.8);
circle.drawCircle(300, 120, 60);
circle.endFill();
// 描けるものを stage に足します。描かれるものすべての先祖にあたる場所です。
app.stage.addChild(rect);
app.stage.addChild(circle);
// requestAnimationFrame のループを回します(1 コマだけなら app.render() を呼びます)。
app.start();
エンジンの入り口です。canvas、レンダラー、そしてシーングラフの根(stage)を抱えています。
new Application(...) より、非同期のファクトリー Application.create(...) を使ってください。WebGPU バックエンドはデバイスの初期化を非同期で行い、それが最初の描画より前に終わっている必要があるからです。Canvas と WebGL はすぐ解決するので、このファクトリーはどのバックエンドでも安全で、書き方もそろいます。
static async です。Application を組み立て、レンダラーの非同期な初期化を待ちます。
| パラメーター |
説明 |
型 |
既定値 |
options |
アプリケーションの設定オプション |
IApplicationOptions |
必須 |
| 値 |
説明 |
型 |
Promise<Application> |
初期化の済んだアプリケーション |
Promise<Application> |
| プロパティ |
説明 |
型 |
stage |
シーングラフの根。描いてほしいノードはすべてここに足します。 |
Container |
view |
描画先になっている canvas 要素。 |
HTMLCanvasElement |
eventSystem |
canvas と stage に結びついた、ポインターとイベントの配送。 |
EventSystem |
| メソッド |
説明 |
返り値 |
render() |
stage を 1 コマだけ描きます。 |
void |
start() |
requestAnimationFrame の描画ループを始めます。 |
void |
stop() |
start() で始めた描画ループを止めます。 |
void |
| フィールド |
説明 |
型 |
既定値 |
prefer |
どのバックエンドを使うか。省くと Canvas になります。 |
RENDERER_TYPE |
RENDERER_TYPE.CANVAS |
view |
描画先の canvas。省くと、どこにも属さない <canvas> が作られます。 |
HTMLCanvasElement |
新しい canvas |
backgroundColor |
canvas の背景。CSS の色文字列ならなんでも受けつけます。 |
string |
— |
backgroundAlpha |
背景の不透明度。0〜1。 |
number |
— |
debug |
選ばれた描画バックエンドをコンソールに出します。 |
boolean |
false |
まとまりを表すノードで、シーングラフでいう「グループ」にあたります。子と変換の状態を持ちますが、それ自体は何も描きません。Graphics のような描けるものは、これを継承しています。まとめて動かす・拡大縮小する・回転させる部分木を作りたいときに Container を足してください。
| メソッド |
説明 |
返り値 |
addChild(child) |
子(Container)を末尾に足します。すでに親がいれば、親を付け替えます。 |
void |
removeChild(child) |
children から子をひとつ外します。 |
void |
sortChildren() |
children を zIndex で並べ替えます(必要なときだけ)。 |
void |
containsPoint(p) |
Point がこのノードの hitArea に当たるか調べます。 |
boolean |
これらは共通の基底ノード(Vertex)にあり、どの Container と Graphics でも使えます。
| プロパティ |
説明 |
型 |
children |
子ノードたち(読み取り専用の配列)。 |
Container[] |
parent |
親ノード。つながっていれば。 |
Container | undefined |
x / y |
位置。親の座標系での値です。 |
number |
position |
位置を表す点({ x, y })。 |
ObservablePoint |
scale |
拡大率を表す点({ x, y })。 |
ObservablePoint |
pivot |
回転と拡大縮小の支点。 |
ObservablePoint |
skew |
傾きを表す点。 |
ObservablePoint |
rotation |
回転。単位はラジアン。 |
number |
angle |
回転。単位は度(rotation と連動します)。 |
number |
alpha |
ノードの不透明度。0〜1(木を下るごとに掛け合わされます)。 |
number |
visible |
false なら、そのノードと部分木は飛ばされます。 |
boolean |
zIndex |
兄弟のあいだでの描画順。 |
number |
hitArea |
当たり判定に使う図形。任意です。 |
Shape | null |
cursor |
そのノードを指したときのカーソルの見た目。 |
Cursor |
structureVersion |
シーン構造の版番号(根だけ)。差分の追跡に使われます。 |
number |
Container を継承した、描けるものです。塗りや線のスタイルを決めてから、図形のメソッドを呼びます。ほとんどのメソッドは this を返すので、そのままつなげて書けます。
| メソッド |
説明 |
返り値 |
beginFill(color?, alpha?) |
color(CSS の文字列。既定は '#000000')と alpha(既定は 1)で塗り始めます。 |
Graphics |
endFill() |
塗りを終えます。 |
Graphics |
lineStyle(width, color?, alpha?) |
線を決めます。太さ width px、color(既定は '#000000')、alpha(既定は 1)。 |
Graphics |
lineStyle(options) |
ILineStyleOptions のオブジェクトから線を決めます。 |
Graphics |
resetLineStyle() |
いまの線を既定値に戻します。 |
void |
| メソッド |
説明 |
返り値 |
drawRect(x, y, width, height) |
長方形。 |
Graphics |
drawRoundedRect(x, y, width, height, radius) |
角の丸い長方形。 |
Graphics |
drawCircle(x, y, radius) |
(x, y) を中心とする円。 |
Graphics |
drawEllipse(x, y, radiusX, radiusY) |
(x, y) を中心とする楕円。 |
Graphics |
drawPolygon(points) |
平らな [x0, y0, x1, y1, …] の配列から作る、閉じた多角形。 |
Graphics |
| メソッド |
説明 |
返り値 |
moveTo(x, y) |
(x, y) から新しいサブパスを始めます。 |
Graphics |
lineTo(x, y) |
(x, y) まで直線を引きます。 |
Graphics |
quadraticCurveTo(cpX, cpY, toX, toY) |
2 次ベジェ曲線(細かい線分に刻んで描きます)。 |
Graphics |
bezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY) |
3 次ベジェ曲線(細かい線分に刻んで描きます)。 |
Graphics |
arc(cx, cy, radius, startAngle, endAngle, anticlockwise?) |
円弧。 |
Graphics |
arcTo(x1, y1, x2, y2, radius) |
制御点を通る二本の線に接する円弧。 |
Graphics |
closePath() |
いまのサブパスを閉じます。 |
Graphics |
clear() |
形をすべて捨て、スタイルを初期状態に戻します。 |
Graphics |
containsPoint(p) |
Point が描かれた形に当たるか調べます。 |
boolean |
| フィールド |
説明 |
型 |
既定値 |
color |
塗りの色(CSS の色ならなんでも)。 |
string |
'#ffffff' |
alpha |
塗りの不透明度。0〜1。 |
number |
1 |
visible |
塗りを描くかどうか。 |
boolean |
false |
IFillStyleOptions を継承し、次を足します。
| フィールド |
説明 |
型 |
既定値 |
width |
線の太さ(px)。 |
number |
0 |
cap |
線の端の形。 |
LINE_CAP |
LINE_CAP.BUTT |
join |
線の継ぎ目の形。 |
LINE_JOIN |
LINE_JOIN.MITER |
IApplicationOptions.prefer で描画バックエンドを選びます。
| メンバー |
値 |
説明 |
CANVAS |
'canvas' |
Canvas2D のバックエンド(既定)。 |
WEB_GL |
'webgl' |
WebGL のバックエンド。 |
WEB_GPU |
'webgpu' |
WebGPU のバックエンド。 |
Graphics の描画メソッドが作る図形の種類です。
| メンバー |
値 |
RECTANGLE |
'rectangle' |
POLYGON |
'polygon' |
CIRCLE |
'circle' |
ELLIPSE |
'ellipse' |
ROUNDED_RECTANGLE |
'rounded rectangle' |
| メンバー |
値 |
BUTT |
'butt' |
ROUND |
'round' |
SQUARE |
'square' |
| メンバー |
値 |
MITER |
'miter' |
BEVEL |
'bevel' |
ROUND |
'round' |
| 定数 |
値 |
説明 |
MAX_VERTEX_COUNT |
65536 |
バッチのバッファ 1 本が扱える頂点の上限。 |
BYTES_PER_VERTEX |
12 |
頂点 1 個あたりのバイト数(Float32 の位置 2 個 + Uint8 の色 4 個)。 |
バックエンドは IApplicationOptions.prefer(RENDERER_TYPE)で選びます。省くと Canvas になります。
CANVAS は Canvas2D の API(fillRect、arc、ctx.stroke() など)でそのまま描きます。
WEB_GL と WEB_GPU はひとつの BatchRenderer の流れを共有します。図形は三角形に分解され、ひとつのインターリーブされた頂点バッファに詰められて、一回の呼び出しで描かれます。
三つのバックエンドはどれも CSS の色ならなんでも受けつけます。16 進(#rgb / #rrggbb)、色名、rgb()、hsl() のいずれも同じように解釈されます。
線の形はバックエンドごとに違います。これは意図的です。 Canvas バックエンドでは線の端と継ぎ目をブラウザー本来の ctx.stroke() が描きますが、WebGL と WebGPU では独自の三角形分割で描きます。両者はピクセル単位で同じにはなりません。