Простейшая 3D программа с использованием Three.js — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Денис (обсуждение | вклад) (Новая страница: «Виртуальная лаборатория > Простейшая 3D программа с использованием Three.js <HR> [http://ru.wikipedia...») |
Денис (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
[http://ru.wikipedia.org/wiki/Three.js Three.js] — это кроссбраузерная библиотека JavaScript, используемая для создания и отображения анимированной компьютерной 3D графики при разработке веб-приложений. | [http://ru.wikipedia.org/wiki/Three.js Three.js] — это кроссбраузерная библиотека JavaScript, используемая для создания и отображения анимированной компьютерной 3D графики при разработке веб-приложений. | ||
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/3D/Example_ThreeJS/ThreeJS_Example_v2-1.html |width=550 |height= | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/3D/Example_ThreeJS/ThreeJS_Example_v2-1.html |width=550 |height=600 |border=0 }} |
+ | |||
+ | Скачать [[Медиа:ThreeJS_Example_v2-1.zip|ThreeJS_Example_v2-1.zip]] | ||
+ | |||
+ | Текст программы на языке JavaScript (разработчик [[Цветков Денис]]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> | ||
+ | Файл '''"ThreeJS_Example_v2-1.js"''' | ||
+ | <source lang="javascript" first-line="1"> | ||
+ | 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 = {}; | ||
+ | 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; | ||
+ | } | ||
+ | } | ||
+ | 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(); | ||
+ | } | ||
+ | </source> | ||
+ | Файл '''"ThreeJS_Example_v2-1.html"''' | ||
+ | <source lang="html" first-line="1"> | ||
+ | <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> | ||
+ | </source> | ||
+ | </toggledisplay> | ||
Версия 22:15, 25 августа 2014
Виртуальная лаборатория > Простейшая 3D программа с использованием Three.jsThree.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 = {};
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;
}
}
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>