beginning gl.enchant

Post on 17-Jan-2015

9.022 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Beginning gl.enchant

TRANSCRIPT

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

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

高橋諒

12年4月23日月曜日

自己紹介

高橋 諒

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

@rtsan

gl.enchant.jsの開発

12年4月23日月曜日

2Dと3Dの違いって?

12年4月23日月曜日

例シューティングゲーム

12年4月23日月曜日

X

Y

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

(x, y)

12年4月23日月曜日

XZ

Y

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

(x, y, z)

12年4月23日月曜日

XZ

Y

(x, y, z)

X

Y

(x, y)

Z軸が増えた

12年4月23日月曜日

2Dは点回転

12年4月23日月曜日

3Dは軸回転

12年4月23日月曜日

回転が複雑になる

12年4月23日月曜日

gl.enchant.jsとは

12年4月23日月曜日

gl.enchant.jsとは

•enchant.jsのプラグイン

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

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

12年4月23日月曜日

glMatrix.js

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

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

12年4月23日月曜日

gl.enchant.jsでできること

12年4月23日月曜日

モデルが読み込める

12年4月23日月曜日

基本図形が使える

12年4月23日月曜日

PitchRoll

Yaw

回転が簡単にできる

12年4月23日月曜日

シェーディングができる

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日月曜日

視点が簡単に動かせる

12年4月23日月曜日

物理エンジンが使える

12年4月23日月曜日

gl.enchant.jsを使ってみる

12年4月23日月曜日

やること0.サンプル

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

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

3.視点を操作する

12年4月23日月曜日

まずサンプル

12年4月23日月曜日

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日月曜日

12年4月23日月曜日

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

プリミティブ モデル

12年4月23日月曜日

の場合プリミティブ

12年4月23日月曜日

primitive.gl.enchant.js

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

  → Cube(s)

平面→ Plane(s)

12年4月23日月曜日

primitive.gl.enchant.js

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

円筒 → Cylinder(r, h)

トーラス → Torus(r, r2)

12年4月23日月曜日

12年4月23日月曜日

プリミティブ

var box = new Cube(1);

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

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

12年4月23日月曜日

テクスチャをはる

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日月曜日

マテリアル

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日月曜日

の場合

モデル

12年4月23日月曜日

collada.gl.enchant.js

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

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

•game.preloadから読み込める

12年4月23日月曜日

モデルの読み込み

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日月曜日

note

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

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

12年4月23日月曜日

オブジェクトを操作する

•移動

•回転

•拡大縮小

12年4月23日月曜日

XZ

Y

表示オブジェクトの移動

•translate(x, y, z); 

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

•どちらも平行移動

12年4月23日月曜日

平行移動だと

translate(2, 0, 1) X

Z

12年4月23日月曜日

直感的でない

translate(2, 0, 1) X

Z

12年4月23日月曜日

XZ

Y

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

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

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

12年4月23日月曜日

向きにあった移動

forward(1.5) X

Z

12年4月23日月曜日

PitchRoll

Yaw

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

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

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

12年4月23日月曜日

XZ

Y

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

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

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

12年4月23日月曜日

droid.scaleZ = 0.0125;

Z軸で縮小すると

12年4月23日月曜日

視点を操作する

を使います

(Camera3D)

12年4月23日月曜日

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

12年4月23日月曜日

カメラの構造注視点

12年4月23日月曜日

カメラの構造上ベクトル

12年4月23日月曜日

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

12年4月23日月曜日

12年4月23日月曜日

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

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

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

X

Z

Y

カメラの移動

12年4月23日月曜日

X

Z

Y

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

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

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

カメラの回転

12年4月23日月曜日

center(0, 0, 0)

(0, 0, 10)

X

Z

Y

視点の操作

12年4月23日月曜日

X

Z

Y

center(0, 0, 0)

(-10, 0, 10)

視点の操作

12年4月23日月曜日

物理エンジンを使う

12年4月23日月曜日

physics.gl.enchant.js

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

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

12年4月23日月曜日

physics.gl.enchant.js

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

•primitive.gl.enchant.jsも必要

12年4月23日月曜日

変わるところ

•Scene3D() → PhyScene3D()

•Sprite3D() → PhySprite3D(rigid)

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

12年4月23日月曜日

剛体

var rigid = new RigidCube(0.5, 5)

0.5

12年4月23日月曜日

変わるところ

•RigidBox(sx, sy, sz, mass)

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

12年4月23日月曜日

Primitive

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

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

12年4月23日月曜日

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

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

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

12年4月23日月曜日

力を加える

(0, 25, -100)

12年4月23日月曜日

力を加える

12年4月23日月曜日

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

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

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

12年4月23日月曜日

当たり判定

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

12年4月23日月曜日

実例

12年4月23日月曜日

とんとんずもうゲーム

12年4月23日月曜日

とんとんずもう

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

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

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

12年4月23日月曜日

ドロイドくんの物理化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日月曜日

剛体を定義

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

r

h

12年4月23日月曜日

合わせる

var player = new PhySprite(rigid);

rigid

player.addChild(...);

12年4月23日月曜日

ざくざくコイン

12年4月23日月曜日

ざくざくコイン

•コイン落としゲーム

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

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

12年4月23日月曜日

初期化

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

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

12年4月23日月曜日

処理

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

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

12年4月23日月曜日

tips

12年4月23日月曜日

暗い

12年4月23日月曜日

Q:空を描くには?

12年4月23日月曜日

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

12年4月23日月曜日

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日月曜日

明るくなった

12年4月23日月曜日

top related