четверг, 7 февраля 2013 г.

Создаём WebGL сцену на странице

Я уже писал, что для создания WebGL нужно, чтобы у вас был новый FireFox или Chrome.

Теперь нужно создать папку и положить в неё файл three.js
После этого, в этой папке нужно создать текстовой файл и вставить следующий код:

<script src="three.min.js"></script>

<body>
       <script>

           var container, stats;
            var camera, scene, renderer;
            var cube, plane;

            var targetRotation = 0;
            var targetRotationOnMouseDown = 0;
            var mouseX = 0;
            var mouseXOnMouseDown = 0;

            var windowHalfX = window.innerWidth / 2;
            var windowHalfY = window.innerHeight / 2;

            init();
            animate();

            function init() {

                container = document.createElement( 'div' );
                document.body.appendChild( container );
              
                camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
                camera.position.y = 150;
                camera.position.z = 500;

                scene = new THREE.Scene();

                // Cube

                var materials = [];

                for ( var i = 0; i < 6; i ++ ) {

                materials.push( new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff } ) );

                }


                cube = new THREE.Mesh( new THREE.CubeGeometry( 200, 200, 200, 1, 1, 1, materials ), new THREE.MeshFaceMaterial() );
                cube.position.y = 150;
                scene.add( cube );

                // Plane

                plane = new THREE.Mesh( new THREE.PlaneGeometry( 200, 200 ), new THREE.MeshBasicMaterial( { color: 0xe0e0e0 } ) );
                plane.geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
                scene.add( plane );

                renderer = new THREE.CanvasRenderer();
                renderer.setSize( window.innerWidth, window.innerHeight );

                container.appendChild( renderer.domElement );
               
                           
               
                document.addEventListener( 'mousedown', onDocumentMouseDown, false );
                document.addEventListener( 'touchstart', onDocumentTouchStart, false );
                document.addEventListener( 'touchmove', onDocumentTouchMove, false );               
           

                window.addEventListener( 'resize', onWindowResize, false );

            }
           
            function onWindowResize() {

                windowHalfX = window.innerWidth / 2;
                windowHalfY = window.innerHeight / 2;

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

            }
           
           
           
           
            function onDocumentMouseDown( event ) {

                event.preventDefault();

                document.addEventListener( 'mousemove', onDocumentMouseMove, false );
                document.addEventListener( 'mouseup', onDocumentMouseUp, false );
                document.addEventListener( 'mouseout', onDocumentMouseOut, false );

                mouseXOnMouseDown = event.clientX - windowHalfX;
                targetRotationOnMouseDown = targetRotation;

            }

           
            function onDocumentMouseMove( event ) {

                mouseX = event.clientX - windowHalfX;

                targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.02;

            }

            function onDocumentMouseUp( event ) {

                document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
                document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
                document.removeEventListener( 'mouseout', onDocumentMouseOut, false );

            }

            function onDocumentMouseOut( event ) {

                document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
                document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
                document.removeEventListener( 'mouseout', onDocumentMouseOut, false );

            }

            function onDocumentTouchStart( event ) {

                if ( event.touches.length === 1 ) {

                    event.preventDefault();

                    mouseXOnMouseDown = event.touches[ 0 ].pageX - windowHalfX;
                    targetRotationOnMouseDown = targetRotation;

                }

            }

            function onDocumentTouchMove( event ) {

                if ( event.touches.length === 1 ) {

                    event.preventDefault();

                    mouseX = event.touches[ 0 ].pageX - windowHalfX;
                    targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.05;

                }

            }
           
           
           
           
            function animate() {

                requestAnimationFrame( animate );

                render();
               

            }

            function render() {

                plane.rotation.y = cube.rotation.y += ( targetRotation - cube.rotation.y ) * 0.05;
                renderer.render( scene, camera );

            }






</script>




        <p>&lt;/head&gt;<br>
        &lt;body&gt;</p>




</body>


После этого сохранить и запустить это файл с помощью Гугл Хром или ФайрФокс

Результат можно посмотреть здесь:
http://2l4u.ru/pub/cube.html

Куб можно вращать мышкой...
Если проанализировать код, то он оказывается очень прозрачным.

Всего две необычных функции
init();  и     animate();

В inite создаётся камера, сцена, массив материалов на каждую сторону куба. Кубу присваиваются материалы, каждой стороне свой. Создаётся плоскость, присваивается материал. Плоскость в нашем случае играет роль тени. Плоскость вращается вместе с кубом.
Создаются слушатели событий, нужные чтобы перехватить нажатия мыши. Создаётся рендер, для трансляции сцены, присваивается слою... всё!

Напоминаю, что WebGL технология новая и работает преимущественно в новом Google Chrome!



Свершилось! Jquery становится friendly mobile

Не совсем конечно, но важно, что вложенные средства в Jquery продолжают работать в правильном направлении.

Появился проект Jquerymobile -http://jquerymobile.com/ - Java Script библиотека адаптированная под мобильные устройства... Jquerymobile будет включен в список глобальных сценариев для обеспечения совместимости с мобильными устройствами в проекте 2l4u.ru

Напомню, что 2l4u.ru разрабатывается как сервис для создания браузерных игр для Блогов и Вконтакте

Вызов функции в фрейме

Иногда требуется вызвать функцию находящуюся внутри фрейма.
Например, при создании редактора сцены, мне пришлось создать интерактивный фрейм, напичканный динамическими объектами и функциями.
Функции приходится вызывать находящиеся внутри фрейма... Это заметно облегчает процесс создания сцены, загрузки объектов, добавления поведения, размещение в различных слоях и т.п.


Возьмите на заметку, для того, чтобы вызвать функцию внутри фрейма нужно использовать top.window.frames[0].function_name(); в FireFox по-другому не работает.
Интересно, что top.window.frames[0].name - в alert отображает имя фрейма, а вот top.window.frames[0].id  ничего не показывает. Возможно этот баг исправят.

Конструкция window.frames[frame_id]. function_name() в файрфокс тоже не работает...

Итак рабочий вариант для firefox -  top.window.frames[0].function_name();

Понятная программа для создания 3d персонажа

Есть такой чудесный ресурс https://www.daz3d.com. Помимо того, что он предлагает интуитивно понятные инструменты и набор героев, в программе есть возможность изменить возраст героя, тип его внешности, расовую принадлежность и т.п. Кроме того, можно поменять текстуры, и превратить героя... например в эльфа или фею. Далее, когда герой создан, есть возможность очень просто его анимировать - добавить движение, и отрендерить - создать клип. Можно создать, так же, последовательность графических кадров. Если требуется прозрачный фон (а при создании игры именно это и требуется) лучше выбрать формат PNG. PNG поддерживает альфа-канал, прозрачный фон. Кроме того, PNG читается большинством современных браузеров.

среда, 6 февраля 2013 г.

Что такое WebGL и как его включить

WebGL  (Web-based Graphics Library) предназначенная для отображения 3d графики на странице в интернете. Когда говорят о 3d происходит некоторая путаница. Связано это с тем, что 3d называют стереоэффект открытый в начале века, если транслировать изображение с двух камер с левой и правой в левый и правый глаз. Возникает эффект "трёхмерности", объёма при движении объектов... Я же виду речь о построении 3d сцены на экране компьютера. Когда изображение, сцену или объёмный объект можно перемещать, поворачивать и т.д. Эта технология к стерео-кино отношения не имеет. И возникла она позже, в 70-е годы, когда появилось цифровое черчение и инженерное моделирование...Эти технологии постепенно переместились в новую отрасль, не существовавшую ранее - отрасль компьютерных игр. Говоря о 3d, я имею ввиду сцену (или объект), построенную с помощью редакторов: 3d Max, Blender, Anim8or  и т.д.
Так вот, совсем недавно, появилась возможность отображать содержимое 3d сцены на странице. Специалисты скажут, а как же Flash? Away3d, Альтернатива и будут, правы... Но! В случае в WebGL речь идёт о появлении библиотеки, которая работает с 3d напрямую, не через флэш-проигрыватель. И! Управляется с помощью Java Script. То есть, технология доступна каждому начинающему делателю сайтов. Но этого мало, чтобы завершить свой вступительный рассказ о WebGL. Не прошло и года, после появления WebGL появились библиотеки упрощающие жизнь начинающему веб-мастеру. Я говорю о Three.js  https://github.com/madlion/three.js/ , OAK 3d www.oak3d.com/
На своём сайте, я сделал демо - 3d конструктор - http://www.2l4u.ru/play_game_80.php - основанный на технологии Three.js


Как включить WebGL
Для того, чтобы открыть для себя бурно развивающийся мир WebGl нужно скачать последнюю версию Google Chrome или FireFox. В моём FireFox поумолчанию был отключен WebGL. Чтобы его включить нужно:
 1. набрать в строке поиска браузера сл. текст: about:config
 2. в настройках about:config указать "webgl.enabled_for_all_sites=true"

В последней версии Google Chrome WebGL работает без активации.

Для Internet Explore есть плагин http://iewebgl.com/

К сожалению плагин для IE не работает с Cannon.JS , но думаю, что разработчики симулятора физических явлений (гравитация, трения, тяжесть, упругость и т.п.) смогут исправить и тогда, появится возможность создавать полноценные 3d игры




А что для Вас игра?

Для меня игра это переосмысление реальности. Реальности не как чего-то неизменного, а как многопользовательской среды, в которой можно изменять сюжет, влиять на судьбу... Для меня игра это конструирование того, чего нет. Как в сказке, сходи туда - не знаю куда; принеси то... не знаю, что. Компьютерная игра меняет мышление. Попадая в неприятную ситуацию, я ловил себя на том, что пытаюсь найти кнопку "отмена", или ищу индикатор - сколько у меня осталось жизней... Однако игровое восприятие может и спасать. Например, когда делаешь, малоинтересную, но нужную работу, можно успокаивать себя, что это просто нудный уровень со скучной графикой, его надо пройти и будет бонус - выходные.