canvasのgetContextに"WebGL"を指定して3Dを扱えるようになりました。(canvasのgetContextに"2D"を指定した場合は2Dです。)
ですが、WebGLを自力で扱うのはかなり大変です。three.jsを使うと3Dを簡単に扱うことができます。
実行サンプル
マウスの左ドラッグ、右ドラッグ、中ボタンの上下で、視点回転、視点平行移動、拡大縮小ができます。
--> //var text3d=new THREE.TextGeometry('Hello!',{size:80,height:20,curveSegments:2,font:"arial"}); //mesh[5]=new THREE.Mesh(text3d,material); //scene.add(mesh[5]); //円柱、円錐 var CyGeo=new THREE.CylinderGeometry(0,10,100,32);//上部半径、下部半径、高さ、半径分割数、縦分割数、Bool型(開くか閉じるか)、開始角 0~2*pi()、シータ角 0~2*pi() mesh[6]=new THREE.Mesh(CyGeo,material); mesh[6].position.set(-10,50,-60); scene.add(mesh[6]); var controls = new THREE.OrbitControls(camera, renderer.domElement); //表示する renderer.render( scene, camera ); //動かす ( function renderLoop () { requestAnimationFrame( renderLoop ); mesh[0].rotation.set( 0, mesh[0].rotation.y + 0.01, mesh[0].rotation.z + 0.01 ) controls.update(); renderer.render( scene, camera ); } )(); }; window.addEventListener( 'DOMContentLoaded', main, false );HTML,Javascriptソースコード
<canvas id="can" style="width: 600px; height: 400px;" width="600" height="400"></canvas> <script src="./three_files/three.min.js"></script> <script src="./three_files/OrbitControls.js"></script> <script> var main = function () { //シーンを作成 scene = new THREE.Scene(); //カメラを作って設定 var width = 600; var height = 400; var fov = 60; var aspect = width / height; var near = 1; var far = 10000; camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); camera.position.set( 0, 0, 100 ); //レンダラーをDOM上に設置する renderer = new THREE.WebGLRenderer({'canvas':document.getElementById('can')}); renderer.setSize( width, height ); renderer.shadowMapEnabled = true;//影可能 //光源------------------------------------------------ //環境光(すべての物体にすべての方向から与える光)これがないと光の当たらない部分は真っ黒になる var AmbientLight=new THREE.AmbientLight(0x666666); scene.add( AmbientLight ); //方向光(太陽の光のようなもの)の設定と追加 var directionalLight = new THREE.DirectionalLight( 0xaaaaaa ); directionalLight.position.set( 0, 0.7, 0.7 ); scene.add( directionalLight ); //スポットライト var spot=new THREE.SpotLight(0xffffff); spot.position.set(0,100,0); spot.target.position.set(0,-100,0); //spot.shadowCameraVisible=true;//これをtrueにすると位置が線で表示される spot.castShadow=true;//影を表示可能に spot.shadowMapWidth = 2048; //影をきれいにする spot.shadowMapHeight = 2048; //影をきれいにする scene.add(spot); //物体を追加する var mesh = new Array(); //幅,高さ,奥行き,幅の分割数,高さの分割数,奥行きの分割数 ちなみにCubeGeometryはBoxGeometryのエイリアス var geometry = new THREE.BoxGeometry( 20, 20, 20 ); var material = new THREE.MeshPhongMaterial( { color: 0xdddddd, specular: 0x009900, shininess: 30, shading: THREE.FlatShading } ); mesh[0] = new THREE.Mesh( geometry, material ); mesh[0].position.set(0,0,0); mesh[0].castShadow=true;//影を落とす mesh[0].receiveShadow=true;//影が落ちる scene.add( mesh[0] ); //半径,経度分割,緯度分割,開始経度,経度中心角,開始緯度,緯度中心角 var geometry = new THREE.SphereGeometry( 10, 16, 16 ); var material = new THREE.MeshPhongMaterial( { color: 0xff0000 } ); mesh[1] = new THREE.Mesh( geometry, material ); mesh[1].position.x=-20; mesh[1].castShadow=true;//影を落とす mesh[1].receiveShadow=true;//影が落ちる scene.add( mesh[1] ); //幅,高さ,幅分割数,高さ分割数 var plane = new THREE.PlaneGeometry(300, 300, 10, 10); var material = new THREE.MeshLambertMaterial( { color: 0x666666 } ); mesh[2] = new THREE.Mesh( plane, material ); mesh[2].rotation.x = -1; mesh[2].position.set( 0, -10, 0 ); //mesh[2].castShadow=true;//影を落とす mesh[2].receiveShadow=true;//影が落ちる scene.add( mesh[2] ); var controls = new THREE.OrbitControls(camera, renderer.domElement); //表示する renderer.render( scene, camera ); //動かす ( function renderLoop () { requestAnimationFrame( renderLoop ); mesh[0].rotation.set( 0, mesh[0].rotation.y + 0.01, mesh[0].rotation.z + 0.01 ) //マウスの左ドラッグ(視点の回転)、右ドラッグ(視点の平行移動)、中ボタン(上下ローラーで拡大縮小)に応答する controls.update(); renderer.render( scene, camera ); } )(); }; window.addEventListener( 'DOMContentLoaded', main, false ); </script;>