Skip to content

visual

PixiJS 流の 2D 描画エンジンです。図形のシーングラフを組み立て、実行時に選んだ三つのバックエンド(Canvas2D、WebGL、WebGPU)のどれかで描きます。

エンジンは層になっています。Application(ライフサイクルと描画ループ)、その下に Renderer(バックエンド)、そして Container(まとまり)から Graphics(描けるもの)へと続くシーングラフです。ノードを app.stage に足すと、レンダラーがそれを描きます。

ブラウザー専用です。 ranuts/visual には本物の HTMLCanvasElement と、GPU または Canvas のコンテキストが要ります。Node では動きません。

読み込み

js
import { Application, Graphics, Container } from 'ranuts/visual';

はじめの一歩

アプリケーションを作り、塗りと線をもつ長方形と円を描いて、描画ループを回します。

js
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();

API

Application

エンジンの入り口です。canvas、レンダラー、そしてシーングラフの根(stage)を抱えています。

new Application(...) より、非同期のファクトリー Application.create(...) を使ってください。WebGPU バックエンドはデバイスの初期化を非同期で行い、それが最初の描画より前に終わっている必要があるからです。Canvas と WebGL はすぐ解決するので、このファクトリーはどのバックエンドでも安全で、書き方もそろいます。

Application.create(options)

static async です。Application を組み立て、レンダラーの非同期な初期化を待ちます。

パラメーター
パラメーター説明既定値
optionsアプリケーションの設定オプションIApplicationOptions必須
返り値
説明
Promise<Application>初期化の済んだアプリケーションPromise<Application>

Properties

プロパティ説明
stageシーングラフの根。描いてほしいノードはすべてここに足します。Container
view描画先になっている canvas 要素。HTMLCanvasElement
eventSystemcanvas と stage に結びついた、ポインターとイベントの配送。EventSystem

Methods

メソッド説明返り値
render()stage を 1 コマだけ描きます。void
start()requestAnimationFrame の描画ループを始めます。void
stop()start() で始めた描画ループを止めます。void

IApplicationOptions

フィールド説明既定値
preferどのバックエンドを使うか。省くと Canvas になります。RENDERER_TYPERENDERER_TYPE.CANVAS
view描画先の canvas。省くと、どこにも属さない <canvas> が作られます。HTMLCanvasElement新しい canvas
backgroundColorcanvas の背景。CSS の色文字列ならなんでも受けつけます。string
backgroundAlpha背景の不透明度。01number
debug選ばれた描画バックエンドをコンソールに出します。booleanfalse

Container

まとまりを表すノードで、シーングラフでいう「グループ」にあたります。子と変換の状態を持ちますが、それ自体は何も描きません。Graphics のような描けるものは、これを継承しています。まとめて動かす・拡大縮小する・回転させる部分木を作りたいときに Container を足してください。

Methods

メソッド説明返り値
addChild(child)子(Container)を末尾に足します。すでに親がいれば、親を付け替えます。void
removeChild(child)children から子をひとつ外します。void
sortChildren()childrenzIndex で並べ替えます(必要なときだけ)。void
containsPoint(p)Point がこのノードの hitArea に当たるか調べます。boolean

変換と表示のプロパティ

これらは共通の基底ノード(Vertex)にあり、どの ContainerGraphics でも使えます。

プロパティ説明
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ノードの不透明度。01(木を下るごとに掛け合わされます)。number
visiblefalse なら、そのノードと部分木は飛ばされます。boolean
zIndex兄弟のあいだでの描画順。number
hitArea当たり判定に使う図形。任意です。Shape | null
cursorそのノードを指したときのカーソルの見た目。Cursor
structureVersionシーン構造の版番号(根だけ)。差分の追跡に使われます。number

Graphics

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

IFillStyleOptions

フィールド説明既定値
color塗りの色(CSS の色ならなんでも)。string'#ffffff'
alpha塗りの不透明度。01number1
visible塗りを描くかどうか。booleanfalse

ILineStyleOptions

IFillStyleOptions を継承し、次を足します。

フィールド説明既定値
width線の太さ(px)。number0
cap線の端の形。LINE_CAPLINE_CAP.BUTT
join線の継ぎ目の形。LINE_JOINLINE_JOIN.MITER

列挙型

RENDERER_TYPE

IApplicationOptions.prefer で描画バックエンドを選びます。

メンバー説明
CANVAS'canvas'Canvas2D のバックエンド(既定)。
WEB_GL'webgl'WebGL のバックエンド。
WEB_GPU'webgpu'WebGPU のバックエンド。

SHAPE_TYPE

Graphics の描画メソッドが作る図形の種類です。

メンバー
RECTANGLE'rectangle'
POLYGON'polygon'
CIRCLE'circle'
ELLIPSE'ellipse'
ROUNDED_RECTANGLE'rounded rectangle'

LINE_CAP

メンバー
BUTT'butt'
ROUND'round'
SQUARE'square'

LINE_JOIN

メンバー
MITER'miter'
BEVEL'bevel'
ROUND'round'

定数

定数説明
MAX_VERTEX_COUNT65536バッチのバッファ 1 本が扱える頂点の上限。
BYTES_PER_VERTEX12頂点 1 個あたりのバイト数(Float32 の位置 2 個 + Uint8 の色 4 個)。

バックエンド

バックエンドは IApplicationOptions.preferRENDERER_TYPE)で選びます。省くと Canvas になります。

  • CANVAS は Canvas2D の API(fillRectarcctx.stroke() など)でそのまま描きます。
  • WEB_GLWEB_GPU はひとつの BatchRenderer の流れを共有します。図形は三角形に分解され、ひとつのインターリーブされた頂点バッファに詰められて、一回の呼び出しで描かれます。

三つのバックエンドはどれも CSS の色ならなんでも受けつけます。16 進(#rgb / #rrggbb)、色名、rgb()hsl() のいずれも同じように解釈されます。

線の形はバックエンドごとに違います。これは意図的です。 Canvas バックエンドでは線の端と継ぎ目をブラウザー本来の ctx.stroke() が描きますが、WebGL と WebGPU では独自の三角形分割で描きます。両者はピクセル単位で同じにはなりません。

MIT ライセンスのもとで公開されています。