three.js のスニペット集
このページでは、three.js のスニペットをまとめています。
- 記載時点の three.js のバージョンは 0.86.0 (r86) です。他のバージョンでは動作しない場合があります。
- webpack を使用する場合は 「webpack + three.js を使用する例」 を参考にしてください。
ベース
javaScript
var container;
var camera, controls, scene, renderer;
init();
animate();
function init() {
container = document.createElement( 'div' );
document.body.appendChild( container );
// レンダラ
renderer = new THREE.WebGLRenderer();
renderer.setClearColor( 0xcccccc );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );
// カメラ
camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.z = 500;
// 場面
scene = new THREE.Scene();
window.addEventListener( 'resize', onWindowResize, false );
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function animate() {
requestAnimationFrame( animate );
render();
}
function render() {
renderer.render( scene, camera );
}
HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
body {
margin: 0px;
overflow: hidden;
}
</style>
<title>Document</title>
</head>
<body>
<script src="bundle.js"></script>
</body>
</html>
オブジェクト
※ scene = new THREE.Scene();
のあとに記載します。
ライト (指向性)
// ライト
var light = new THREE.DirectionalLight( 0xffffff );
light.position.set( 1, 1, 1 );
scene.add( light );
箱
// 箱
var cube = new THREE.Mesh( new THREE.BoxGeometry( 100, 100, 100 ), new THREE.MeshLambertMaterial( { color: 0xff0000 } ) );
cube.position.y = 100;
scene.add( cube );
球体
// 球体
var sphere = new THREE.Mesh( new THREE.SphereGeometry( 50, 32, 32 ), new THREE.MeshLambertMaterial( {color: 0xffff00} ) );
sphere.position.y = 200;
scene.add( sphere );
グリッド
// グリッド
var gridHelper = new THREE.GridHelper( 300, 10 );
scene.add( gridHelper );
コントロール
カメラ制御 (OrbitControls)
// webpack.config.js (resolve.alias 内。webpack 使用時)
'three/OrbitControls': path.join(__dirname, 'node_modules/three/examples/js/controls/OrbitControls.js'),
// コード先頭 (webpack 使用時)
import 'three/OrbitControls';
// init() 内
// カメラ制御
controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;
controls.dampingFactor = 0.25;
// render() 内
controls.update();
カメラ制御 (TracballControls)
// webpack.config.js (resolve.alias 内。webpack 使用時)
'three/TrackballControls': path.join(__dirname, 'node_modules/three/examples/js/controls/TrackballControls.js'),
// コード先頭 (webpack 使用時)
import 'three/TrackballControls';
// init() 内
// カメラ制御
controls = new THREE.TrackballControls( camera );
controls.rotateSpeed = 1.0;
controls.zoomSpeed = 1.2;
controls.panSpeed = 0.8;
controls.noZoom = false;
controls.noPan = false;
controls.staticMoving = true;
controls.dynamicDampingFactor = 0.3;
オブジェクトのドラッグ
// webpack.config.js (resolve.alias 内。webpack 使用時)
'three/DragControls': path.join(__dirname, 'node_modules/three/examples/js/controls/DragControls.js'),
// コード先頭 (webpack 使用時)
import 'three/DragControls';
// init() 内
// ※ objects は、箱や球体などのオブジェクトが格納された配列にします。
// ※ controlsが無い場合は dragstart, dragend は不要です。
var dragControls = new THREE.DragControls( objects, camera, renderer.domElement );
dragControls.addEventListener( 'dragstart', function ( event ) { controls.enabled = false; } );
dragControls.addEventListener( 'dragend', function ( event ) { controls.enabled = true; } );
マウスピッキング
// init() の前
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
// init() 内など
window.addEventListener( 'mousemove', onMouseMove, false );
// init() の後など
function onMouseMove( event ) {
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
}
// render() 内
raycaster.setFromCamera( mouse, camera );
var intersects = raycaster.intersectObjects( scene.children );
if (intersects.length > 0) {
var object = intersects[ 0 ].object; // ピックされた最初のオブジェクト
}