WebGLでぐりぐり物体を動かして遊ぼうと思ったのだけど、記述が面倒だったのでThree.jsに頼ることにしてみる。
今回は簡単な二次元や三次元の図形を表示するところまで。
極力短いコードで四角形を表示してみる。
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <script src="three.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <script> $(document).ready( function() { // Rendererを用意 var renderer = new THREE.WebGLRenderer( { 'canvas' : $('#canvas')[0] } ); // Cameraを用意(近すぎると物体が見えないのでZ軸を500にする) var camera = new THREE.PerspectiveCamera(); camera.position.z = 500; // 100×100のPlaneGeometryを用意 var geometry = new THREE.PlaneGeometry(100, 100); var mesh = new THREE.Mesh( geometry ); // Sceneを用意 var scene = new THREE.Scene(); scene.add( camera ); scene.add( mesh ); // render renderer.render( scene, camera ); } ); </script> </head> <body> <canvas id="canvas" style="width:300px; height: 300px; border:solid 1px"> えーマジ Canvas非対応なの!? キモーイ そんなブラウザ使って許されるのは小学生までだよねー </canvas> </body> </html>
これを実行すると、下記のような四角が描画される。黒枠はCanvasのborder。図形の色を今回は指定していないので、ランダムで表示される色が変わる。
図形に色を指定してみる。Meshを初期化する際に、Materialでcolorを指定して、Meshに入れてあげればいい。
// 100×100のPlaneGeometryを用意 var geometry = new THREE.PlaneGeometry(100, 100); var material = new THREE.MeshBasicMaterial( { color: 0xff0000 } ) var mesh = new THREE.Mesh( geometry, material );
平面の四角ではつまらないので、3Dの物体を出してみる。まずは円柱。
PlaneGeometry(100, 100) をnewしていたところを、下記のように変える。色はなんとなく青っぽくした。
// デフォルトサイズのCylinderGeometryを用意 var geometry = new THREE.CylinderGeometry(); var material = new THREE.MeshBasicMaterial( { color: 0x00ffff } ) var mesh = new THREE.Mesh( geometry, material );
なんか大きさが小さいので、適当なサイズを指定してみる。
CylinderGeometryの引数は function ( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded ) なので、radiusTop(TOPの半径), radiusBottom(BOTTOMの半径), height(高さ)の3つを指定してあげればサイズ指定は可能。デフォルトは20, 20, 100なので倍の40, 40, 200にしてみる。
var geometry = new THREE.CylinderGeometry(40, 40, 200);
大きくなった。
radiusTopを120にするとこんな感じ。
var geometry = new THREE.CylinderGeometry(120, 40, 200);
光が当たってないとイマイチ3Dらしさに欠けるので、立方体(CubeGeometry)に光を当ててみる。
CubeGeometryの引数は、( width, height, depth, widthSegments, heightSegments, depthSegments ) なので、とりあえず200*200*200のを出してみる。
var geometry = new THREE.CubeGeometry(200, 200, 200); var material = new THREE.MeshBasicMaterial( { color: 0x00ff88 } ) var mesh = new THREE.Mesh( geometry, material ); mesh.rotation.x = 10; mesh.rotation.y = 10;
正面から立方体を見てもただの2Dの四角にしか見えないので、rotationを少し回している。
これに光を当てれば、影とかが出てより3Dらしく見える。materialがMeshBasicMaterialのままだと陰影が出ないので、MeshLambertMaterialに切り替えて、あとはDirectionalLight(指定した方向から光を向ける)を当ててみる。
// Cameraを用意(近すぎると物体が見えないのでZ軸を500にする) var camera = new THREE.PerspectiveCamera(); camera.position.z = 500; // デフォルトサイズのCylinderGeometryを用意 var geometry = new THREE.CubeGeometry(200, 200, 200); var material = new THREE.MeshLambertMaterial( { color: 0x00ff88 } ) var mesh = new THREE.Mesh( geometry, material ); mesh.rotation.x = 10; mesh.rotation.y = 10; // 光源を用意 var light = new THREE.DirectionalLight(0xffffff); light.position.set(1, 1, 1).normalize(); // Sceneを用意 var scene = new THREE.Scene(); scene.add( camera ); scene.add( mesh ); scene.add(light); // render renderer.render( scene, camera );
3Dっぽくなった。