Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как работает ось Z (http://www.flasher.ru/forum/showthread.php?t=206658)

Marlin 18.02.2014 08:33

Как работает ось Z
 
Немного не понял каким образом работает ось z, насколько я понимаю она должна быть направлена перпендикулярно плоскости монитора, но когда начинаю менять координату z - объекта, он начинает "съезжать" (визуально менять координату центра), а ммне нужно чтобы он увеличивался относительно центра, как такое можно сделать? Также интересует каким образом зависит "съезжание" объекта от положения точки регистрации ?

silin 18.02.2014 10:53

>>он начинает "съезжать"
зависит от того, откуда 'смотрим'
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
 
 
        public class Main extends Sprite
        {
                private var obj:Sprite = new Sprite();
                public function Main():void
                {
                        obj.graphics.beginFill(0x0080FF);
                        obj.graphics.drawCircle(0, 0, 50);
                        addChild(obj);
                        stage.addEventListener(MouseEvent.MOUSE_WHEEL, stage_mouseWheel);
                        //====================//
                        // можно поставить объект напротив наблюдателя по умочанию
                        //obj.x = stage.stageWidth * 0.5;
                        //obj.y = stage.stageHeight * 0.5;
                        //====================//
                        // можно поставить наблюдателя напротив объекта
                        obj.x = 200;
                        obj.y = 200;
                        root.transform.perspectiveProjection.projectionCenter = new Point(obj.x, obj.y);
                        //====================//
 
                }
 
                private function stage_mouseWheel(e:MouseEvent):void
                {
                        obj.z += 20*e.delta;
                }
 
        }
 
}


Marlin 18.02.2014 11:26

то есть если мне нужно "приподнять" все объекты на 2D карте, нужно для каждого объекта перемещать наблюдателя в центр объекта? это нормальная практика? тоесть по сути z- это будет высота объекта на 2d карте, просто нужна высота, для будущего преобразования карты в 3D, а еще вопрос, допустим для масштабирования карты целиком нормально ли использовать этот подход? или лучше скейл

Добавлено через 11 минут
вот переделал ваш код, это нормальный подход или костыли?

Код AS3:

 
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.PerspectiveProjection;
import flash.geom.Point;
 
        public class Main extends Sprite
        {
                private var obj:Sprite = new Sprite();
                private var obj2:Sprite = new Sprite();
 
 
                public function Main():void
                {
                        obj.graphics.beginFill(0x0080FF);
                        obj.graphics.drawCircle(0, 0, 50);
                        addChild(obj);
 
                        obj2.graphics.beginFill(0x034555);
                        obj2.graphics.drawCircle(0, 0, 50);
                        addChild(obj2);
                        stage.addEventListener(MouseEvent.MOUSE_WHEEL, stage_mouseWheel);
 
                        obj.x = 200;
                        obj.y = 200;
 
                        obj2.x = 400;
                        obj2.y = 400;
 
                        obj.transform.perspectiveProjection = new PerspectiveProjection();
                        obj.transform.perspectiveProjection.projectionCenter = new Point(obj.x, obj.y);
 
 
                        obj2.transform.perspectiveProjection = new PerspectiveProjection();
                        obj2.transform.perspectiveProjection.projectionCenter = new Point(obj2.x, obj2.y);
 
 
                }
 
                private function stage_mouseWheel(e:MouseEvent):void
                {
                        obj.z += 10 * e.delta;
                        obj2.z += 10 * e.delta;
 
                }
 
        }
 
}


silin 18.02.2014 11:42

>>нужно для каждого объекта перемещать наблюдателя в центр объекта?
трудно сказать что нужно - есть наблюдатель, есть объекты, от их взаимного расположения зависит проекция на экран.., при этом для разных объектов эта зависимость может быть и разная, ага

>>это нормальная практика?
при наличии сегодня вменяемых 3Д движков типа away3d \ Alternativa, это псевдо-3Д вообще никакая не практика, все настолько невнятно и мутно, что разруливать эту логику нет никакого желания

Bletraut 19.02.2014 03:25

Съезжает он вниз из-за перспективной проекции, отключите перспективу и ни че съезжать не будет, но и растягиваться тоже.

Marlin 19.02.2014 06:32

в том то и дело, что нужно чтобы объекты на карте растянулись, но не съезжали, и растянулись все относительно своего центра

Dukobpa3 19.02.2014 06:59

Где ноль по х,у - от того места и растягиваются.
Если ноль в лево-верх - понятно что съедут.

Marlin 19.02.2014 12:02

так вот, чтобы несколько объектов по оси Z сдвинуть относительно их центров, нужно для каждого объекта точку наблюдателя переназначать? или есть какие-то альтернативные способы?

silin 19.02.2014 12:49

для такого расклада (наблюдатель всегда напротив) не нужно никакого 3D, посчитать как изменится объект можно из элементарной геометрии
в терминах того же примера это
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite
        {
                private var obj:Obj = new Obj();
                private var obj2:Obj = new Obj();
 
 
                public function Main():void
                {
 
                        addChild(obj);
                        addChild(obj2);
 
                        stage.addEventListener(MouseEvent.MOUSE_WHEEL, stage_mouseWheel);
 
                        obj.x = 200;
                        obj.y = 200;
 
                        obj2.x = 400;
                        obj2.y = 400;
 
                }
 
                private function stage_mouseWheel(e:MouseEvent):void
                {
 
                        obj.zPos += 10 * e.delta;
                        obj2.zPos += 10 * e.delta;
 
                }
 
        }
 
}
//////////////////////////
import flash.display.Sprite;
 
class Obj extends Sprite
{
        public static var viewDistance:Number = 800;
        private var _zPos:Number=0;
        public function Obj()
        {
                graphics.beginFill(0x0080FF);
                graphics.drawCircle(0, 0, 50);
 
        }
 
        public function get zPos():Number
        {
                return _zPos;
        }
 
        public function set zPos(value:Number):void
        {
                _zPos = value;
                scaleX = scaleY = viewDistance / (viewDistance - zPos);
 
        }
 
}


Marlin 19.02.2014 14:40

объекты с большой вложенностью, и с фильтрами на разных уровнях, при скейле нужно будет еще пересчитывать все фильтры, а при движении по оси z - фильтры "растягиваются" вместе с объектом", а если учитывать что вся эта карта (со всеми объектами тоже скейлится, и при этом скейле я уже пересчитываю все фильтры) то скейл каждого объекта выглядит вдвойне проблематичней


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

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