Solufaに触ってみる(ダウンロードからサンプルをアップしてみるまで。)
Solufaとりあえず触れてみます。
先日のVR Tech Tokyoで開発者の松田さん(@m_mitsuhide)からリリースほやほやのタイミングで発表があった、速くて軽いwebVRライブラリ「Solufa」。
VirtualDOMベースということで、恥ずかしながらVirtualDOMさっぱりなんですが、とりあえず触るだけ触ってみようと思います。
まずは、ほんとの基本、ダウンロードからサンプルをアップしてみるまでです。まだソースはさわりません!!(きっぱり)
VR INSIDEさんの記事を参考にしています。
アップするサンプルは2つ。
・公式サイトからダウンロードしたライブラリデータに入ってるサンプル(BOXが1000個ならぶやつなど)
・VR Insideのサンプル(箱がひとつ。タップすると色が変わるやつ)
Solufaファイルのダウンロード
ますは、ライブラリのファイルをダウンロードしましょう。
公式サイトをスクロールしていくと、「Dounload ZIP」というボタンがあるのでポチリ。
または、GitHubでも。
【solufa-master.zip】というファイルがダウンロードされるので、適当な場所に解凍します。
Gulpを使ってる人は、ダウンロードしたsolufa-masterフォルダにgulpfile.jsやpackage.jsonなどが揃ってるので、Gulpでごにょごにょもできます。(今回はソースはいじらないので、localhost立ててスマホで確認とかくらいですが。)
※Browserifyをインストールしている必要があるので、使ってない人はこことかを参考にインストールしておいてください。
Solufaライブラリ内のサンプルファイル
solufa-masterフォルダを解凍したら、
solufa-master/static/samples/
の中にサンプルファイルがいくつか入っています。
普通にhtmlファイルをダブルクリックすればブラウザで確認出来ますが、スマホで確認するのにサーバにアップするなら、staticフォルダごとアップします。
Solufaメイン部分のソースは下記。
S( function( m ) { var stats = new Stats(); stats.domElement.style.position = "fixed"; stats.domElement.style.left = "5px"; stats.domElement.style.top = "5px"; document.body.appendChild(stats.domElement); requestAnimationFrame( function update() { requestAnimationFrame( update ); stats.update(); }); var App = { vm: { geo: { type: "Box", value: [ 5, 5, 5 ] }, mtl: { type: "MeshPhong", value: { color: "#00f", specular: "#999" } }, meshPoses: [], lightStyle: { pos: [ 1, 10, 10 ], lightColor: "#00f" }, init: function() { for ( var i = 0; i < 10; i++ ) { for ( var j = 0; j < 10; j++ ) { for ( var k = 0; k < 10; k++ ) { this.meshPoses.push({ pos: [i*10-45,j*10-45,k*10-45] }); } } } }, rotate: function( elem, isInit ) { if ( isInit ) return; S.update( function( delta, elapsed ) { elem.style.rotateY += delta * .0002; elem.style.rotateX += delta * .0002; elem.style.opacity = .2 + .8 * Math.abs( Math.sin( elapsed * .0005 ) ); elem.childNodes[ 0 ].style.colorR = Math.abs( Math.sin( elapsed * .0005 ) ); elem.childNodes[ 0 ].style.colorG = Math.abs( Math.cos( elapsed * .0005 ) ); elem.childNodes[ 0 ].style.colorB = 1 - Math.abs( Math.sin( elapsed * .0005 ) ); }); } }, controller: function() { App.vm.init(); }, view: function() { var vm = App.vm; return <scene> <obj config={vm.rotate}> { vm.meshPoses.map( v => <mesh geo={vm.geo} mtl={vm.mtl} style={v}/>)} </obj> <cam id="cam" style={{ posZ: 155 }}/> <light init={{ type: "Dir" }} style={ vm.lightStyle }/> <light init={{ type: "Amb" }}/> </scene>; } }; m.mount( S.document.body, App ); m.render( S.document.head, <rdr init={{ frame: "#solufa", antialias: true, preserveDrawingBuffer: false }}> <OrbitVp cam="#cam"/> </rdr> ); });
マウスでドラッグしたりできます。
ていうか、描画はや!!
VR Insideのサンプル
A-Frameを越えて世界最速を目指すWeb3D/VRライブラリ「Solufa(ソルファ)」の秘密に迫る【開発者のAMATELUS Inc.代表・松田光秀氏にインタビュー】ーVR Inside
こちらの記事は、松田さんのインタビューやA-Frameとの比較など、Solufaの基本がわかるので、是非一度お読みください。
で、そこに書いてあったサンプルコードはこちら。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> </head> <body> <div id="solufa" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%;"></div> <script src="./viewer/js/Solufa.min.js"></script> <script src="./viewer/js/Solufa-OrbitVp.js"></script> <script src="./viewer/js/MSXTransformer.js"></script> <script type="text/msx;harmony=true"> S( function( m ) { var App = { controller: function() { return { geo: { type: "Box", value: [ 3, 3, 3 ] }, mtl: { type: "MeshPhong", value: { specular: "#999" } }, color: "#00f", changeColor: function() { this.color = this.color === "#00f" ? "#f00" : "#00f"; }, camStyle: { pos: [ 0, -5, 8 ] } }; }, view: function( ctrl ) { return <scene> <mesh geo={ ctrl.geo } mtl={ ctrl.mtl } style={{ color: ctrl.color }} onclick={ ctrl.changeColor.bind( ctrl )}/> <cam id="mainCam" style={ctrl.camStyle}> <light init={{ type: "Dir" }} style={{ pos: [0, 10,10 ] }}/> </cam> <light init={{ type: "Amb" }}/> </scene>; } }; m.mount( S.document.body, App ); m.render( S.document.head, <rdr init={{ frame: "#solufa", antialias: true }}> <OrbitVp cam="#mainCam"/> </rdr> ); }); </script> </body> </html>
※上記記事より転載。
これを動作させます。
1.適当なサイトデータ用のフォルダを作り、上記のコードを【index.html】として保存します。
2.index.htmlと同階層に【viewer】フォルダをつくりさらにviewerフォルダの中に【js】フォルダを作ります。
3.さきほどダウンロードしたsolufaのライブラリフォルダから
・solufa-master/static/js/Solufa.min.js
・solufa-master/static/js/MSXTransformer.js
・solufa-master/static/components/Solufa-OrbitVp.js
の3ファイルをコピーして、今作ったjsフォルダに貼り付けます。
これで、index.htmlを実行すれば、空間内に青い立方体があり、クリックで色が変わるサンプルが見れると思います。
ファイル構造は下記。
└/viewer ─ /js ┬ Solufa.min.js
├ Solufa-OrbitVp.js
└ MSXTransformer.js
サーバーにアップするならこのフォルダごと。
いかがでしょうか?
といっても、まだVRにもしていないサンプルだけですが。
とりあえず、なんとなく読めそうですが、VirtualDOMの基礎くらいは勉強してからかなーと。
簡単なものならA-Frameのほうが使いやすい、複雑になるならSolufaのほうが速くていい。
て感じで使い分けられればベストかなー思います。