Appearance
はじめよう
4行のサンプルプログラムの実行
以下の4行のプログラムで3Dのオブジェクトを表示できます。
js
import * as a3 from 'a3js';
const view = new a3.Window(600,300);
const obj = new a3.SampleObject();
view.scene.add(obj);「実行」ボタンを押すと下の枠内でこのプログラムが実行されます。
4行サンプルの解説
上のサンプルプログラムを1行ずつ見ていきましょう。
js
import * as a3 from 'a3js';a3jsライブラリをa3という名前で読み込みます。以降、a3jsの クラスや関数はa3.Windowのようにa3.をつけて使用します。
js
const view = new a3.Window(600,300);幅600ピクセル、高さ300ピクセルの3D表示用ウィンドウを作ります。 a3.Windowはタイトルバー付きの浮動ウィンドウで、newするだけで 自動的にページに追加されます。タイトルバーをドラッグして移動、 端をドラッグしてリサイズ、「×」ボタンで閉じることができます。
js
const obj = new a3.SampleObject();動作確認用のサンプルオブジェクト(回転する緑の立方体)を作ります。
js
view.scene.add(obj);作ったオブジェクトをウィンドウのシーンに追加します。シーンに 追加されたオブジェクトが画面に表示されます。
Windowの中のSceneとCamera
a3.Windowは「View」と呼ばれる3D表示クラスの1つで、内部に 以下のものを持っています。
view.scene— 表示するオブジェクトを追加するシーンview.camera— シーンを映すカメラview.controller— マウスやタッチの入力を処理するコントローラー
カメラにはヘッドライト(カメラと一緒に動く光源)がついているため、 ライトを用意しなくてもオブジェクトが見えます。ヘッドライトは view.camera.setHeadLight(false);で消すことができます。 ライトについて詳しくはライトについてを 参照してください。
カメラの位置はview.camera.setPosition(0,0,10);のように変更できます。
いろいろなView
Viewにはa3.Windowの他にも以下のものがあります。
- Windowクラス — タイトルバー付きの浮動ウィンドウ。
newするだけで表示されるので 手軽に始められます。 - Canvasクラス — 通常のHTML要素として自分でページに配置するタイプのView。 CSSで自由にデザインできます。
- GameCanvasクラス — スマートフォン向けのジョイスティックUIがついたView。 PCではW/A/S/Dキーや矢印キーで操作できます。
- VRViewクラス — ヘッドマウントディスプレイ(HMD)でのVR表示用のView。
- ARViewクラス — スマートフォンなどでのAR表示用のView。
詳しくは3Dの表示形式を参照してください。
モードの紹介
a3jsのオブジェクトはsetMode()で「モード」を切り替えることで、 位置・回転・拡大率の制御方法を変更できます。
js
obj.setMode('SimplePhysics');モードには以下の8種類があります。
Default— 位置・回転・拡大率を即座に反映します(初期モード)。Smooth— 約1秒かけてなめらかに補間しながら移動します。Follow— 別のオブジェクトを追従します。カメラをプレイヤーに 追従させるときなどに使います。Billboard— 常にターゲット(通常はカメラ)の方向を向きます。SmoothBillboard— なめらかにターゲット方向を向きます。SimplePhysics— 物理エンジン(Rapier)による剛体物理演算で動きます。KinematicCharacter— カプセルコライダーによるキネマティック キャラクター制御を使います。DynamicCharacter— カプセルコライダーによる動的キャラクター 制御を使います。
詳しくはモードについてを参照してください。
移動と回転のサンプル
setPosition()で移動、setRotation()で回転ができます。 回転の角度は度(°)で指定します。以下は青い箱を回転させながら 左右に往復させるサンプルです。
js
import * as a3 from 'a3js';
const view = new a3.Window(600,300);
const obj = new a3.Box("blue");
view.scene.add(obj);
let t = 0;
while (true) {
t += 2;
obj.setRotation(0,t,0);
obj.setPosition(2*Math.sin(t*Math.PI/180),0,0);
await view.waitForRender();
}view.waitForRender()は次の描画タイミングまで待つメソッドで、 このようにループと組み合わせてアニメーションを作れます。
移動・回転・拡大縮小について詳しくは 移動・回転・拡大縮小についてを 参照してください。
物理モードの紹介
SimplePhysicsなどの物理系のモードを使うと、重力や衝突などの 物理演算でオブジェクトを動かせます。物理系のモードを使う前には await a3.initPhysics();で物理エンジンを初期化する必要があります。
以下は固定した床(rigidBody: 'fixed')の上に箱を落とすサンプルです。
js
import * as a3 from 'a3js';
await a3.initPhysics();
const view = new a3.Window(600,300);
view.camera.setPosition(0,0,10);
const ground = new a3.Box(10,0.5,10,"red");
ground.setMode('SimplePhysics',{rigidBody: 'fixed'});
ground.setPositionNow(0,-3,0);
view.scene.add(ground);
const box = new a3.Box("blue");
box.setMode('SimplePhysics');
box.setPositionNow(0,2,0);
box.setRotationNow(45,30,0);
view.scene.add(box);物理系のモードではsetPosition()ではなく、setPositionNow()の ようにNowがついたメソッドで位置や回転を強制的に変更します。
詳しくはSimplePhysicsモードを 参照してください。
a3js Playgroundでの実行
ブラウザだけでa3jsのプログラムを書いて試せる a3js Playgroundを 用意しています。
- 左側のエディタにプログラムを書いて「実行」ボタンで実行、 「停止」ボタンで停止できます。
console.log()の出力やエラーはエディタ下のConsoleに表示されます。- 「保存」ボタンでプログラムをファイルとしてダウンロード、 「開く」ボタンでファイルを読み込めます。
- 編集中のプログラムはページを離れるときにブラウザに自動保存され、 次に開いたときに復元されます。
HTMLファイルでの利用(importmap)
自分のウェブページにa3jsのプログラムを組み込むには、importmapで a3jsと依存ライブラリのCDNのURLを指定します。以下のHTMLファイルを 作ってブラウザで開くだけで、最初の4行のサンプルが動きます。
html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>a3js sample</title>
<script type="importmap">
{
"imports": {
"three": "https://cdn.jsdelivr.net/npm/three@latest/build/three.module.min.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/three@latest/examples/jsm/",
"@dimforge/rapier3d-compat": "https://cdn.jsdelivr.net/npm/@dimforge/rapier3d-compat@0.19.3/+esm",
"fflate": "https://cdn.jsdelivr.net/npm/fflate@0.8.2/+esm",
"meshoptimizer": "https://unpkg.com/meshoptimizer@1.0.1/meshopt_decoder.module.js",
"a3js": "https://cdn.jsdelivr.net/npm/a3js@1/+esm"
}
}
</script>
</head>
<body>
<script type="module">
import * as a3 from 'a3js';
const view = new a3.Window(600,300);
const obj = new a3.SampleObject();
view.scene.add(obj);
</script>
</body>
</html>CSSでのデザイン
ページのデザインに合わせて3D表示を配置したい場合は、 a3.Windowの代わりにa3.Canvasを使います。a3.Canvasは 通常のHTML要素(カスタム要素<canvas-a3>)なので、CSSで サイズや位置を自由に指定でき、ページへの追加も自分で行います。
js
import * as a3 from 'a3js';
const view = new a3.Canvas();
view.style.cssText = 'width:600px;height:300px;border:solid 1px;';
document.body.appendChild(view);
const obj = new a3.SampleObject();
view.scene.add(obj);node.jsでの利用
node.jsがインストールされていれば、Viteなどの 開発ツールと組み合わせて使うこともできます。a3jsは npmで公開されています。
sh
npm create vite@latest myapp -- --template vanilla
cd myapp
npm install
npm install a3js three @dimforge/rapier3d-compat fflatesrc/main.js(テンプレートによってはmain.js)の内容を以下に 置き換えます。
js
import * as a3 from 'a3js';
const view = new a3.Window(600,300);
const obj = new a3.SampleObject();
view.scene.add(obj);開発サーバーを起動してブラウザで表示を確認します。
sh
npm run devthree.jsなどの依存ライブラリの推奨バージョンの組み合わせは不明。
TypeScriptでの利用
a3jsには型定義ファイルが含まれているので、TypeScriptからも そのまま使用できます。Viteのテンプレートにvanilla-tsを指定すると TypeScriptのプロジェクトが作られます。
sh
npm create vite@latest myapp -- --template vanilla-tsあとはJavaScriptの場合と同じで、src/main.tsにプログラムを書きます。 import * as a3 from 'a3js';とすれば、エディタで補完や型チェックが 効くようになります。