beginning gl.enchant

84
gl.enchant.js で始める WebGL 3Dプログラミング 株式会社ユビキタスエンターテインメント 秋葉原リサーチセンター 高橋諒 12423日月曜日

Upload: ryo-shimizu

Post on 17-Jan-2015

9.022 views

Category:

Technology


0 download

DESCRIPTION

Beginning gl.enchant

TRANSCRIPT

Page 1: Beginning gl.enchant

gl.enchant.js で始める WebGL 3Dプログラミング

株式会社ユビキタスエンターテインメント秋葉原リサーチセンター

高橋諒

12年4月23日月曜日

Page 2: Beginning gl.enchant

自己紹介

高橋 諒

株式会社ユビキタスエンターテインメント秋葉原リサーチセンター

@rtsan

gl.enchant.jsの開発

12年4月23日月曜日

Page 3: Beginning gl.enchant

2Dと3Dの違いって?

12年4月23日月曜日

Page 4: Beginning gl.enchant

例シューティングゲーム

12年4月23日月曜日

Page 5: Beginning gl.enchant

X

Y

オブジェクトの位置は(x, y)で表される

(x, y)

12年4月23日月曜日

Page 6: Beginning gl.enchant

XZ

Y

オブジェクトの位置は(x, y, z)で表される

(x, y, z)

12年4月23日月曜日

Page 7: Beginning gl.enchant

XZ

Y

(x, y, z)

X

Y

(x, y)

Z軸が増えた

12年4月23日月曜日

Page 8: Beginning gl.enchant

2Dは点回転

12年4月23日月曜日

Page 9: Beginning gl.enchant

3Dは軸回転

12年4月23日月曜日

Page 10: Beginning gl.enchant

回転が複雑になる

12年4月23日月曜日

Page 11: Beginning gl.enchant

gl.enchant.jsとは

12年4月23日月曜日

Page 12: Beginning gl.enchant

gl.enchant.jsとは

•enchant.jsのプラグイン

•WebGLを使ったゲームを作れる

•インターフェースは2Dとほぼ同じ

12年4月23日月曜日

Page 13: Beginning gl.enchant

glMatrix.js

•行列・ベクトル演算のライブラリ

•内部で演算に使用している

12年4月23日月曜日

Page 14: Beginning gl.enchant

gl.enchant.jsでできること

12年4月23日月曜日

Page 15: Beginning gl.enchant

モデルが読み込める

12年4月23日月曜日

Page 16: Beginning gl.enchant

基本図形が使える

12年4月23日月曜日

Page 17: Beginning gl.enchant

PitchRoll

Yaw

回転が簡単にできる

12年4月23日月曜日

Page 18: Beginning gl.enchant

シェーディングができる

ambient diffuse specular result[0.3, 0.3, 0.3, 1.0]

0.5 0.5[0.5, 0.5, 0.5, 1.0] [0.5, 0.5, 0.5, 1.0]

0.3

+ + =

12年4月23日月曜日

Page 19: Beginning gl.enchant

視点が簡単に動かせる

12年4月23日月曜日

Page 20: Beginning gl.enchant

物理エンジンが使える

12年4月23日月曜日

Page 21: Beginning gl.enchant

gl.enchant.jsを使ってみる

12年4月23日月曜日

Page 22: Beginning gl.enchant

やること0.サンプル

1.画面にオブジェクトを出す

2.オブジェクトを操作する(移動・回転)

3.視点を操作する

12年4月23日月曜日

Page 23: Beginning gl.enchant

まずサンプル

12年4月23日月曜日

Page 24: Beginning gl.enchant

1 enchant(); 2 window.onload = function() { 3 var game = new Game(640, 640); 4 game.onload = function() { 5 var scene = new Scene3D(); 6 var box = new Cube(); 7 scene.addChild(box); 8 }; 9 game.start(); 10 };

Hello, Cube

12年4月23日月曜日

Page 25: Beginning gl.enchant

12年4月23日月曜日

Page 26: Beginning gl.enchant

画面にオブジェクトを出す

プリミティブ モデル

12年4月23日月曜日

Page 27: Beginning gl.enchant

の場合プリミティブ

12年4月23日月曜日

Page 28: Beginning gl.enchant

primitive.gl.enchant.js

•基本図形の呼び出し箱 → Box(sx, sy, sz),

  → Cube(s)

平面→ Plane(s)

12年4月23日月曜日

Page 29: Beginning gl.enchant

primitive.gl.enchant.js

•基本図形の呼び出し球 → Sphere(r)

円筒 → Cylinder(r, h)

トーラス → Torus(r, r2)

12年4月23日月曜日

Page 30: Beginning gl.enchant

12年4月23日月曜日

Page 31: Beginning gl.enchant

プリミティブ

var box = new Cube(1);

game.onload = function() { ......

...... scene.addChild(box); ......

12年4月23日月曜日

Page 32: Beginning gl.enchant

テクスチャをはる

var box = new Cube(1);

......

box.mesh.texture = new Texture('enchant.png');

...... scene.addChild(box);

box.mesh.texture.ambient = [ 0.8, 0.8, 0.8, 1.0 ];

12年4月23日月曜日

Page 33: Beginning gl.enchant

マテリアル

ambient diffuse specular result

各パラメータで陰影、反射の具合を設定する

[0.3, 0.3, 0.3, 1.0]

0.5 0.5[0.5, 0.5, 0.5, 1.0] [0.5, 0.5, 0.5, 1.0]

0.3

+ + =

12年4月23日月曜日

Page 34: Beginning gl.enchant

の場合

モデル

12年4月23日月曜日

Page 35: Beginning gl.enchant

collada.gl.enchant.js

•Collada(.dae)ファイルの読み込み

•ジョイント, アニメーションは未対応

•game.preloadから読み込める

12年4月23日月曜日

Page 36: Beginning gl.enchant

モデルの読み込み

game.preload('droid.dae');

var game = new Game(640, 640);

game.onload = function() { ......

scene.addChild(droid); ......

var droid = game.assets['droid.dae'].clone();

12年4月23日月曜日

Page 37: Beginning gl.enchant

note

•プリロードされたデータはSprite3Dのインスタンスとして格納されている

•clone()かset()で複製して使う

12年4月23日月曜日

Page 38: Beginning gl.enchant

オブジェクトを操作する

•移動

•回転

•拡大縮小

12年4月23日月曜日

Page 39: Beginning gl.enchant

XZ

Y

表示オブジェクトの移動

•translate(x, y, z); 

•x, y, zプロパティの変更

•どちらも平行移動

12年4月23日月曜日

Page 40: Beginning gl.enchant

平行移動だと

translate(2, 0, 1) X

Z

12年4月23日月曜日

Page 41: Beginning gl.enchant

直感的でない

translate(2, 0, 1) X

Z

12年4月23日月曜日

Page 42: Beginning gl.enchant

XZ

Y

表示オブジェクトの移動•forward(s)→ オブジェクトのZ軸方向移動

•sidestep(s)→ オブジェクトのX軸方向移動

•altitude(s)→ オブジェクトのY軸方向移動

12年4月23日月曜日

Page 43: Beginning gl.enchant

向きにあった移動

forward(1.5) X

Z

12年4月23日月曜日

Page 44: Beginning gl.enchant

PitchRoll

Yaw

表示オブジェクトの回転•rotateRoll(rad)→ オブジェクトのZ軸回転

•rotatePitch(rad)→ オブジェクトのX軸回転

•rotateYaw(rad)→ オブジェクトのY軸回転

12年4月23日月曜日

Page 45: Beginning gl.enchant

XZ

Y

表示オブジェクトの拡大縮小

•scaleX, scaleY, scaleZ→ 拡大率の指定

•scale(sx, sy, sz)→ 拡大率をかける

12年4月23日月曜日

Page 46: Beginning gl.enchant

droid.scaleZ = 0.0125;

Z軸で縮小すると

12年4月23日月曜日

Page 47: Beginning gl.enchant

視点を操作する

を使います

(Camera3D)

12年4月23日月曜日

Page 48: Beginning gl.enchant

カメラの構造カメラの位置

12年4月23日月曜日

Page 49: Beginning gl.enchant

カメラの構造注視点

12年4月23日月曜日

Page 50: Beginning gl.enchant

カメラの構造上ベクトル

12年4月23日月曜日

Page 51: Beginning gl.enchant

上ベクトルでカメラの傾きが決まる

12年4月23日月曜日

Page 52: Beginning gl.enchant

12年4月23日月曜日

Page 53: Beginning gl.enchant

•forward(s)→ カメラのZ軸方向移動

•sidestep(s)→ カメラのX軸方向移動

•altitude(s)→ カメラのY軸方向移動

X

Z

Y

カメラの移動

12年4月23日月曜日

Page 54: Beginning gl.enchant

X

Z

Y

•rotateRoll(rad)→ カメラの視線ベクトル回転

•rotatePitch(rad)→ カメラのX軸回転

•rotateYaw(rad)→ カメラの上ベクトル回転

カメラの回転

12年4月23日月曜日

Page 55: Beginning gl.enchant

center(0, 0, 0)

(0, 0, 10)

X

Z

Y

視点の操作

12年4月23日月曜日

Page 56: Beginning gl.enchant

X

Z

Y

center(0, 0, 0)

(-10, 0, 10)

視点の操作

12年4月23日月曜日

Page 57: Beginning gl.enchant

物理エンジンを使う

12年4月23日月曜日

Page 58: Beginning gl.enchant

physics.gl.enchant.js

•手軽に物理シミュレートが利用できる

•拘束条件(ジョイント)・軟体(布など)には未対応

12年4月23日月曜日

Page 59: Beginning gl.enchant

physics.gl.enchant.js

•ammo.jsが必要→ javascriptの物理演算ライブラリ

•primitive.gl.enchant.jsも必要

12年4月23日月曜日

Page 60: Beginning gl.enchant

変わるところ

•Scene3D() → PhyScene3D()

•Sprite3D() → PhySprite3D(rigid)

→ 剛体オブジェクトを渡す

12年4月23日月曜日

Page 61: Beginning gl.enchant

剛体

var rigid = new RigidCube(0.5, 5)

0.5

12年4月23日月曜日

Page 62: Beginning gl.enchant

変わるところ

•RigidBox(sx, sy, sz, mass)

→ 大きさ、質量を設定する

12年4月23日月曜日

Page 63: Beginning gl.enchant

Primitive

•Cube(s) → PhyCube(s, mass)

→ 剛体オブジェクトは内部で作られる

12年4月23日月曜日

Page 64: Beginning gl.enchant

力を加える•applyCentralImpulse(px, py, pz)→ 物体の中心に力を加える

•applyImpulse(px, py, pz, x, y, z)→ 指定した位置に力を加える

•clearForces()→ 物体にかかっている力をリセットする

12年4月23日月曜日

Page 65: Beginning gl.enchant

力を加える

(0, 25, -100)

12年4月23日月曜日

Page 66: Beginning gl.enchant

力を加える

12年4月23日月曜日

Page 67: Beginning gl.enchant

シミュレートの再生・停止

•PhyScene3D.play()→ 物理世界の時間をうごかす

•PhyScene3D.stop()→ 物理世界の時間をとめる

12年4月23日月曜日

Page 68: Beginning gl.enchant

当たり判定

•PhySprite3D.contactTest()→ 物理オブジェクト同士の厳密な当たり判定

12年4月23日月曜日

Page 69: Beginning gl.enchant

実例

12年4月23日月曜日

Page 70: Beginning gl.enchant

とんとんずもうゲーム

12年4月23日月曜日

Page 71: Beginning gl.enchant

とんとんずもう

•飛行機の中で作った(40分くらい)

•ドロイドくん(.dae)を物理化

•クリックすることで力を与える(だけ)

12年4月23日月曜日

Page 72: Beginning gl.enchant

ドロイドくんの物理化var rigid = new RigidCylinder(0.3, 1, 5); var player = new PhySprite3D(rigid);

player.addChild( game.assets['droid.dae'].clone())

player.childNodes[0].y = -1;

12年4月23日月曜日

Page 73: Beginning gl.enchant

剛体を定義

var rigid = new PhyCylinder(0.3, 1, 5)

r

h

12年4月23日月曜日

Page 74: Beginning gl.enchant

合わせる

var player = new PhySprite(rigid);

rigid

player.addChild(...);

12年4月23日月曜日

Page 75: Beginning gl.enchant

ざくざくコイン

12年4月23日月曜日

Page 76: Beginning gl.enchant

ざくざくコイン

•コイン落としゲーム

•ハッカソンで作った(3~5時間)

•ほとんどの処理を物理エンジンに任せる

12年4月23日月曜日

Page 77: Beginning gl.enchant

初期化

•コインを空中にランダムに設置

•play()すると勝手にセットされる

12年4月23日月曜日

Page 78: Beginning gl.enchant

処理

•押し出しバーを周期的に動かす→ コインの挙動は物理エンジン任せ

•落ちたコインは当たり判定で回収

12年4月23日月曜日

Page 79: Beginning gl.enchant

tips

12年4月23日月曜日

Page 80: Beginning gl.enchant

暗い

12年4月23日月曜日

Page 81: Beginning gl.enchant

Q:空を描くには?

12年4月23日月曜日

Page 82: Beginning gl.enchant

A:でかい球で世界を包む

12年4月23日月曜日

Page 83: Beginning gl.enchant

var sky = new Sphere(50); sky.mesh.reverse(); sky.mesh.texture = new Texture('sky.png'); sky.mesh.texture.ambient = [ 1.0, 1.0, 1.0, 1.0 ]; sky.mesh.texture.diffuse = [ 0.0, 0.0, 0.0, 1.0 ]; sky.mesh.texture.specular = [ 0.0, 0.0, 0.0, 1.0 ]; scene.addChild(box);

12年4月23日月曜日

Page 84: Beginning gl.enchant

明るくなった

12年4月23日月曜日