Редактирование: Простейшая 3D программа с использованием Three.js

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
[[Виртуальная лаборатория]] > [[Простейшая 3D программа с использованием Three.js]] <HR>
 
[[Виртуальная лаборатория]] > [[Простейшая 3D программа с использованием Three.js]] <HR>
Здесь расположена простейшая 3D программа, написанная с помощью библиотеки Three.js.
 
 
 
[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=620 |border=0 }}
'''Чтобы работало управление, нужно щелкнуть окно программы.'''
 
 
 
{{#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]]
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''Текст программы на языке JavaScript (разработчик [[Цветков Денис]]):''' <div class="mw-collapsible-content">
 
Файл '''"ThreeJS_Example_v2-1.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
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();
 
}
 
</syntaxhighlight>
 
Файл '''"ThreeJS_Example_v2-1.html"'''
 
<syntaxhighlight lang="html5" line start="1" enclose="div">
 
<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>
 
</syntaxhighlight>
 
</div>
 
</div>
 
  
  
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)