Autor: Jiří Hnídek / jiri.hnidek@tul.cz
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>My first Three.js app</title>
</head>
<body>
<script src="js/three.js"></script>
<script>
// Naše Three.js aplikace
</script>
</body>
</html>
// set the scene size
var width = 400, height = 300;
// Set some camera attributes
var view_angle = 35, aspect = width / height, near = 0.1, far = 10000;
// create a WebGL renderer, camera and a scene
var renderer = new THREE.WebGLRenderer({antialias: true}); // WebGL only
renderer.setSize(width, height);
var camera = new THREE.PerspectiveCamera(view_angle, aspect, near, far);
var scene = new THREE.Scene();
scene.add(camera);
camera.position.z = 5.0;
// Attach the render to element <div id="container"><div>
document.getElementById("container").appendChild(renderer.domElement);
// Start the renderer
renderer.render(scene, camera);
<script src="Detector.js"></script>
Detector.webgl
renderer = new THREE.WebGLRenderer();
<script src="CanvasRenderer.js"></script>
renderer = new THREE.CanvasRenderer();
renderer.setSize(width, height);
var camera = new THREE.PerspectiveCamera(view_angle, aspect, near, far);
var camera = new THREE.OrthographicCamera(left, right,
top, bottom,
near, far);
“Dejte mi pevný bod a pohnu zemí.”
var scene = new THREE.Scene();
scene.add(camera);
document.getElementById("container").appendChild(renderer.domElement);
renderer.render(scene, camera);
var cube_geom = new THREE.BoxGeometry(1.0, 1.0, 1.0);
var material = new THREE.MeshBasicMaterial({color: 0x00aa00});
var cube_obj = new THREE.Mesh(cube_geom, material);
scene.add(cube_obj);
var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(0.0, 0.0, 0.0));
geometry.vertices.push(new THREE.Vector3(1.0, 0.0, 0.0));
geometry.vertices.push(new THREE.Vector3(0.5, 1.0, 0.0));
geometry.faces.push(new THREE.Face3(0, 1, 2);
Objekt vytvořený v nějakém 3D apliakci můžeme načíst pomocí mnoha loaderů. Jedním z nich je JSON loader:
var loader = new THREE.JSONLoader();
loader.load( "model_example.json", function(geometry){
var material = new THREE.MeshLambertMaterial({color: 0x00aa00});
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
});
Následující kód se pokusí vykreslit scénu s obnovovací frekvencí 60 FPS. Pokud canvas nebude vidět, tak se vykreslování zastaví a šetří se baterky.
var render = function () {
requestAnimationFrame( render );
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
renderer.render(scene, camera);
};
render();
Nejprve nastavíme barvu pozadí:
renderer.setClearColorHex(0x333F47, 1);
Vytvoříme bodový zdroj světla. Nastavíme mu pozici a přidáme ho do scény:
var light = new THREE.PointLight(0xffffff);
light.position.set(-100,200,100);
scene.add(light);
Materiál používající Phongův osvětlovací model:
var phong_mat = MeshPhongMaterial({color: 0x00aa00});
Materiál používající Lambertův osvětlovací model:
var material = new THREE.MeshLambertMaterial({color: 0x00aa00});
Pro ovládání pohledu kamery je potřeba v html souboru vložit:
<script type="text/javascript" src="js/TrackballControls.js"></script>
Ovladač kamery vytvoříme a nastavíme následovně:
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;
controls.keys = [65, 83, 68];
controls.addEventListener('change', render);
function render() {renderer.render(scene, camera);};
Nejprve si vytvoříme loader textur:
var loader = new THREE.TextureLoader();
V loaderu nastavíme cestu k textuře přiřadíme mu callback funkce pro vytvoření materiálu:
loader.load('textura.png',
function ( texture ) {
var tex_material = new THREE.MeshBasicMaterial( {
map: texture
} );
// Následně materiál můžeme přiřadit nějakému objektu
},
function ( xhr ) {
console.log( (xhr.loaded/xhr.total*100) + '% loaded' );
},
function ( xhr ) {console.log( 'An error happened' );}
}
V případě, že aplikaci vyvíjíte, tak je šikovné mít přehled, jak rychle se scéna vykresluje. K tomu může posloužit:
stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0px';
stats.domElement.style.zIndex = 100;
document.body.appendChild( stats.domElement );