Простейшая 3D программа с использованием Three.js
Материал из Department of Theoretical and Applied Mechanics
Версия от 23:38, 25 августа 2014; Денис (обсуждение | вклад)
Виртуальная лаборатория > Простейшая 3D программа с использованием Three.js
Здесь расположена простейшая 3D программа, написанная с помощью библиотеки Three.js. Three.js — это кроссбраузерная библиотека JavaScript, используемая для создания и отображения анимированной компьютерной 3D графики при разработке веб-приложений.
Чтобы работало управление, нужно щелкнуть окно программы.
Скачать ThreeJS_Example_v2-1.zip
Текст программы на языке JavaScript (разработчик Цветков Денис): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "ThreeJS_Example_v2-1.js"
function Main_ThreeJS_example() {
//-- Параметры --//
var width = 500;
var height = 500;
// Переменные
var theta = 0, phi= 0; // углы поворота
var zStart = 2; // чтобы можно было восстановить начальное состояние по кнопке [home]
var z = zStart; // расстояние до куба
var cube, camera, renderer, scene;
// Работа с клавиатурой
var currentlyPressedKeys = {};
var keys = [33, 34, 36, 37, 38, 39, 40];
function handleKeys() { // обработка нажатий клавиш
if (currentlyPressedKeys[33]) {z -= 0.02;} // Page Up
if (currentlyPressedKeys[34]) {z += 0.02;} // Page Down
if (currentlyPressedKeys[37]) {phi = -2;} // Влево
if (currentlyPressedKeys[39]) {phi = 2;} // Вправо
if (currentlyPressedKeys[38]) {theta = -2;} // Вверх
if (currentlyPressedKeys[40]) {theta = 2;} // Вниз
}
function handleKeyDown(event) { // клавиша нажата
currentlyPressedKeys[event.keyCode] = true;
if (event.keyCode == "36") { // Home
camera.rotation.x = camera.rotation.y = camera.rotation.z = 0;
z = zStart;
}
for (var k = 0; k < keys.length; k++) // чтобы не блокировать лишние клавиши
if (keys[k] == event.keyCode) return false;
}
function handleKeyUp(event) { // клавиша отпущена
currentlyPressedKeys[event.keyCode] = false;
}
var render = function () {
handleKeys();
requestAnimationFrame(render);
setCameraPos();
renderer.render(scene, camera);
};
function setCameraPos() { // функция поворота
camera.rotateOnAxis({x:1, y:0, z:0}, -theta * Math.PI / 180 );
camera.rotateOnAxis({x:0, y:1, z:0}, -phi * Math.PI / 180 );
phi = 0; theta = 0;
camera.position.x = z * Math.sin(camera.rotation.y);
camera.position.y = z * Math.sin(-camera.rotation.x) * Math.cos(camera.rotation.y);
camera.position.z = z * Math.cos(-camera.rotation.x) * Math.cos(camera.rotation.y);
}
function start3DCanvas() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(60, width/height, 0.1, 1000);
scene.add(camera);
renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
renderer.setClearColor( 0xeeeeff, 1);
var geometry = new THREE.BoxGeometry(1,1,1); // геометрия фигуры, задаем куб
var material = new THREE.MeshLambertMaterial({ // материал куба, в данном случае - текстура
map: THREE.ImageUtils.loadTexture('teormeh.png')
});
cube = new THREE.Mesh(geometry, material);
cube.updateMatrix();
cube.overdraw = true;
scene.add(cube);
var ambientLight = new THREE.AmbientLight(0xffffff); // освещение, без него куб будет черным
scene.add(ambientLight);
document.onkeydown = handleKeyDown;
document.onkeyup = handleKeyUp;
ThreeJS_div.appendChild(renderer.domElement);
render();
}
// Запуск программы
start3DCanvas();
}
Файл "ThreeJS_Example_v2-1.html"
<html>
<head>
<title>ThreeJS Example</title>
<script src="three.min.js"></script>
<script src="ThreeJS_Example_v2-1.js"></script>
</head>
<body onload="Main_ThreeJS_example();">
<div id="ThreeJS_div"></div>
<ul>
<li>Стрелочки - поворот куба
<li><code>[Home]</code> - вернуть куб в исходное положение
<li><code>[Page Up]</code>/<code>[Page Down]</code> - приближение/отдаление
</ul>
</body>
</html>
</toggledisplay>