HTML + CSS
まずはHTML。divに適当なIDを付与して、文字を入れたかったので入れてる。
HTML
<div id="view"> <h1>Sphere Wireframe</h1> </div>
CSSはdivに高さを設定する。
横幅は100%にしてます。
CSS
#view { color: #fff; width: 100%; height: 500px; text-align: center; background: #000; position: relative; } #view h1 { top: 50%; margin-top: -15px; position: absolute; width: 100%; text-align: center; }
上半分だけが表示されている球体
JavaScriptをみてみましょう。
See the Pen Three.js Sphere Wireframe Animation 01 by webopixel (@webopixel) on CodePen.
JavaScript
window.addEventListener('DOMContentLoaded', init); function init() { var container = document.getElementById( 'view' ); document.body.appendChild( container ); var width = container.clientWidth; var height = container.clientHeight; // レンダラーを作成 var renderer = new THREE.WebGLRenderer(); renderer.setSize(width, height ); container.appendChild( renderer.domElement ); // シーンを作成 var scene = new THREE.Scene(); // カメラを作成 var camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000); camera.position.set(0, 100, 100); // オブジェクトを作成 var geometry = new THREE.SphereGeometry( 100, 40, 40 ); var material = new THREE.MeshPhongMaterial( { color: 0x000000, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 1 } ); var mesh = new THREE.Mesh(geometry, material); scene.add( mesh ); // ワイヤーフレーム var geo = new THREE.EdgesGeometry( mesh.geometry ); var mat = new THREE.LineBasicMaterial( { color: 0x666666, linewidth: 2 } ); var wireframe = new THREE.LineSegments( geo, mat ); mesh.add( wireframe ); var light = new THREE.AmbientLight( 0x404040, 1 ); scene.add( light ); // レンダリング renderer.render(scene, camera); // アニメーション実行 animate(); function animate() { requestAnimationFrame(animate); // オブジェクトを回転 mesh.rotation.y += 0.001; // レンダリング renderer.render(scene, camera); } }
- 4~8行目
- 要素のサイズを取得してレンダラーに適用しています。
- 19~20行目
- カメラの位置です。ここを調節するだけで色々見え方が変わってきますので、色々やってみてください。
- 23~38行目
- 球体を作成してます。ワイヤーフレームにするオプションもあるのですが、裏面も表示されてしまうので、ワイヤーフレーム用のオブジェクトも作成しています。
白バージョン
先ほどとほとんど同じですが、白バックで黒ワイヤーの球体を右半分だけ表示してみます。
See the Pen Three.js Sphere Wireframe Animation 02 by webopixel (@webopixel) on CodePen.
JavaScript
window.addEventListener('DOMContentLoaded', init); function init() { var container = document.getElementById( 'view' ); document.body.appendChild( container ); var width = container.clientWidth; var height = container.clientHeight; // レンダラーを作成 var renderer = new THREE.WebGLRenderer(); renderer.setSize(width, height ); renderer.setClearColor(0xffffff); container.appendChild( renderer.domElement ); // シーンを作成 var scene = new THREE.Scene(); // カメラを作成 var camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000); camera.position.set(100, 0, 150); // オブジェクトを作成 var geometry = new THREE.SphereGeometry( 100, 40, 40 ); var material = new THREE.MeshPhongMaterial( { color : 0xffffff, specular : 0xffffff, emissive : 0xffffff, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 1 } ); var mesh = new THREE.Mesh(geometry, material); scene.add( mesh ); // ワイヤーフレーム var geo = new THREE.EdgesGeometry( mesh.geometry ); var mat = new THREE.LineBasicMaterial( { color: 0xbbbbbb, linewidth: 2 } ); var wireframe = new THREE.LineSegments( geo, mat ); mesh.add( wireframe ); var light = new THREE.AmbientLight( 0x404040, 1 ); scene.add( light ); // レンダリング renderer.render(scene, camera); // アニメーション実行 animate(); function animate() { requestAnimationFrame(animate); // オブジェクトを回転 mesh.rotation.y += 0.001; // レンダリング renderer.render(scene, camera); } }
以上、Three.jsの基本的な機能しか使ってませんが、3Dってだけでなんだか作り込んでる感が出てる感じがしませんか。
参考サイト:
最新版で学ぶThree.js入門 – 手軽にWebGLを扱える3Dライブラリ
three.js – Display wireframe and solid color – Stack Overflow