|
|
|||||
Регистрация: Feb 2014
Сообщений: 57
|
Как работает ось Z
Немного не понял каким образом работает ось z, насколько я понимаю она должна быть направлена перпендикулярно плоскости монитора, но когда начинаю менять координату z - объекта, он начинает "съезжать" (визуально менять координату центра), а ммне нужно чтобы он увеличивался относительно центра, как такое можно сделать? Также интересует каким образом зависит "съезжание" объекта от положения точки регистрации ?
|
|
|||||
>>он начинает "съезжать"
зависит от того, откуда 'смотрим' 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; } } } |
|
|||||
Регистрация: Feb 2014
Сообщений: 57
|
то есть если мне нужно "приподнять" все объекты на 2D карте, нужно для каждого объекта перемещать наблюдателя в центр объекта? это нормальная практика? тоесть по сути z- это будет высота объекта на 2d карте, просто нужна высота, для будущего преобразования карты в 3D, а еще вопрос, допустим для масштабирования карты целиком нормально ли использовать этот подход? или лучше скейл
Добавлено через 11 минут вот переделал ваш код, это нормальный подход или костыли? 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; } } } |
|
|||||
>>нужно для каждого объекта перемещать наблюдателя в центр объекта?
трудно сказать что нужно - есть наблюдатель, есть объекты, от их взаимного расположения зависит проекция на экран.., при этом для разных объектов эта зависимость может быть и разная, ага >>это нормальная практика? при наличии сегодня вменяемых 3Д движков типа away3d \ Alternativa, это псевдо-3Д вообще никакая не практика, все настолько невнятно и мутно, что разруливать эту логику нет никакого желания |
|
|||||
Съезжает он вниз из-за перспективной проекции, отключите перспективу и ни че съезжать не будет, но и растягиваться тоже.
|
|
|||||
Регистрация: Feb 2014
Сообщений: 57
|
в том то и дело, что нужно чтобы объекты на карте растянулись, но не съезжали, и растянулись все относительно своего центра
|
|
|||||
Регистрация: Feb 2014
Сообщений: 57
|
так вот, чтобы несколько объектов по оси Z сдвинуть относительно их центров, нужно для каждого объекта точку наблюдателя переназначать? или есть какие-то альтернативные способы?
|
|
|||||
для такого расклада (наблюдатель всегда напротив) не нужно никакого 3D, посчитать как изменится объект можно из элементарной геометрии
в терминах того же примера это 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); } } |
|
|||||
Регистрация: Feb 2014
Сообщений: 57
|
объекты с большой вложенностью, и с фильтрами на разных уровнях, при скейле нужно будет еще пересчитывать все фильтры, а при движении по оси z - фильтры "растягиваются" вместе с объектом", а если учитывать что вся эта карта (со всеми объектами тоже скейлится, и при этом скейле я уже пересчитываю все фильтры) то скейл каждого объекта выглядит вдвойне проблематичней
|
Часовой пояс GMT +4, время: 00:53. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|