Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   3D движки, поворот объекта (http://www.flasher.ru/forum/showthread.php?t=208142)

in4core 07.06.2014 04:11

3D движки, поворот объекта
 
Сразу начну с того, что с 3д движками никогда не работал , но тут решил одну штуку для себя запилить, а так как эта одна штука совсем простая, то разбираться во всем движке смысла не вижу, так как на будущее в 3д переходить не собираюсь. Движок ( как я понял единственный развивающийся еще ) был выбран Away 3d .
Задача приблизительно следующая, создается сетка объектов, считай 2мерная матрица, как доска шахмат. Каждый из квадратиков может повернуться , а на противоположной стороне какая то графика. Представим обычный Flip карты 2х сторонней.
Собственно вопрос, как создать такую сетку в авай 3д. Поскольку я нуб, изначально мне показалось, что для каждого такого спрайта3д - придется делать отдельный вьюпорт и настраивать камеру, если это не так, и можно обойтись одной камерой и вьюпортом, посоветуйте как.
Спасибо. ( а если пример с кодом покажите, вообще цены вам нет )
К сожалению в нете пример не нашел :(

FlasherEgor 07.06.2014 12:02

Вообще, я тоже нуб, но в Away давно копаюсь, поэтому набросал вам небольшой код:

Главный класс:
Код AS3:

package  
{
        import away3d.cameras.Camera3D;
        import away3d.containers.Scene3D;
        import away3d.containers.View3D;
        import away3d.entities.Mesh;
        import away3d.materials.ColorMaterial;
        import away3d.materials.TextureMaterial;
        import away3d.primitives.CubeGeometry;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author FlasherEgor
        */

        public class Test1 extends Sprite
        {
 
                private var scene:Scene3D;
                private var camera:Camera3D;
                private var view:View3D;
 
                //Хранить квадратики.
                private var squares:Vector.<Square> = new Vector.<Square>();
 
                public function Test1()
                {
                        //Сначала все создаем.
                        scene = new Scene3D();
                        camera = new Camera3D();
                        view = new View3D(scene, camera);
                        addChild(view);
 
 
                        //Создаем квадратики. Можно их в какой-то "2мерной матрице" хранить, но я выбрал вектор, чтобы не заморачиваться.
                        for (var ix:int = 0; ix <= 10; ix++)
                        for (var iy:int = 0; iy <= 10; iy++)
                        {
                                var sq:Square = new Square();
                                //Двигаем его по сцене.
                                sq.x = (ix - 5) * 55;
                                sq.z = (iy - 5) * 55;
 
                                //Сообщаем, какая у него позиция.
                                sq.numberOfPosition.x = ix;
                                sq.numberOfPosition.y = ix;
 
                                //Добавляем на сцену и в вектор.
                                scene.addChild(sq);
                                squares.push(sq);
                        }
 
                        //Чуть-чуть отодвигаем камеру, чтобы все видеть.
                        camera.y = 500;
                        camera.z = -500;
                        camera.rotationX = 45;
 
 
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);//Понятно, для чего
                }
 
                public function enterFrameHandler(e:Event):void
                {
                        for each(var square:Square in squares) square.dispatchEvent(e);//Повторяем события ENTER_FRAME для каждого квадратика. Я просто не знаю, как иначе проиграть анимацию.
                        view.render();//Рендерим
                }
 
        }
 
}

Квадратик:
Код AS3:

package
{
        import away3d.containers.ObjectContainer3D;
        import away3d.core.base.Geometry;
        import away3d.entities.Mesh;
        import away3d.events.MouseEvent3D;
        import away3d.events.Object3DEvent;
        import away3d.materials.ColorMaterial;
        import away3d.materials.MaterialBase;
        import away3d.primitives.PlaneGeometry;
        import flash.events.Event;
        import flash.geom.Point;
 
        /**
        * ...
        * @author FlasherEgor
        */

        public class Square extends ObjectContainer3D
        {
 
                private var _faceMesh:Mesh; //"красная" сторона, но она он может быть любой. Это что спереди.
                private var _backMesh:Mesh; //"синяя" сторона, но она может быть любой. Это что сзади. Например, картинка, которая там должна быть.
                private var _commonGeometry:Geometry; //По сути, они оба одинаковые, пусть у них будет одинаковая геометрия.
 
                private var _rotationLimit:int = 0; //Для анимации. Сколько кадров до переворота.
                private var _rotationSpeed:int = 5; //Для анимации. На сколько градусов мы поворачиваем плоскость за кадр.
                private var _nextStateIsRed:Boolean = true; //После анимации квадратик станет красным?
 
                public var numberOfPosition:Point = new Point(0, 0); //Хранить, в какой условной клетке квадратик находится.
 
                public function Square()
                {
                        super();//Здесь понятно
 
 
                        _commonGeometry = new PlaneGeometry(50, 50);//Создаем геометрию для обоих сторон
                        _faceMesh = new Mesh(_commonGeometry, new ColorMaterial(0xF00000));//Создаем верхнюю сторону. Материал может быть любой. Условно здесь - красный цвет.
                        _backMesh = new Mesh(_commonGeometry, new ColorMaterial(0x0000F0));//Создаем нижнюю сторону. Материал может быть любой. Условно здесь - синий цвет.
                        _backMesh.rotationZ = 180;//Заднюю сторону поворачиваем на 180 градусов.
 
                        //Разрешаем диспатчить события мыши
                        _faceMesh.mouseEnabled = true;
                        _backMesh.mouseEnabled = true;
 
                        //Квадратик, наследуясь от ObjectContainer3D, добавляет стороны в себя
                        addChildren(_faceMesh, _backMesh);
 
                        //Ждем, когда пользователь нажмет клавишу мыши.
                        addEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);
                }
                public function mouseDownHandler(e:MouseEvent3D):void
                {
                        //Теперь ждем, когда пользователь прекратит нажимать. Аналог MouseEvent.CLICK получается.
                        addEventListener(MouseEvent3D.MOUSE_UP, mouseUpHandler);
                }
                public function mouseUpHandler(e:MouseEvent3D):void
                {
                        removeEventListener(MouseEvent3D.MOUSE_UP, mouseUpHandler);//Перестаем ждать, когда пользователь отпустит мышь
                        removeEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);//Кроме того, запрещаем нажимать еще раз, пока анимация не кончится
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);//Запускаем событие обновления кадра для анимации - ну, я просто не знаю, как иначе это сделать.
 
                        _rotationLimit = 180 / _rotationSpeed;//Настраиваем анимацию.
                        _nextStateIsRed = !_nextStateIsRed;//Если сейчас должен был быть красный, то потом будет синий.
                }
                public function enterFrameHandler(e:Event):void
                {
 
                        rotationZ += _rotationSpeed;//Поворачиваем по Z наш квадратик
                        _rotationLimit --;//-1 кадр должен прокрутиться
 
                        if (_rotationLimit <= 0)//если анимация кончилась то
                        {
                                rotationZ = (_nextStateIsRed)?0:180;//Корректируем поворот. Если трейсить, там погрешность в какие-то сверхмаленькие доли, но нужно, чтобы было четко.
                                removeEventListener(Event.ENTER_FRAME, enterFrameHandler);//Прекращаем анимацию
                                addEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);//Разрешаем пользователю поворачивать квадратик еще раз
 
                                //Здесь можно, например, диспатчить какое-то событие.
                                //Или вызывать какой-нибудь метод. Трейс для примера.
                                trace(numberOfPosition.x, numberOfPosition.y, ' - теперь я' , (_nextStateIsRed)?'красный.':'синий.');
 
                        }
                }
 
        }
 
}

Не знаю, насколько качественный алгоритм, но работает.
А если надо, вы, как опытный флэшер, легко переделаете на свой.

in4core 07.06.2014 15:07

FlasherEgor - просто огромное Вам спасибо! Буду читать, похоже очень интересно вышло. !!!

faraday 07.06.2014 23:31

а зачем 3d движок, чем rotationY не подходит?

in4core 08.06.2014 01:26

Цитата:

а зачем 3d движок, чем rotationY не подходит?
Будут кубы, плотность, текстуры.


Часовой пояс GMT +4, время: 12:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.