|
|
|||||
Регистрация: Jul 2012
Сообщений: 148
|
Скейл относительно точки
Не могу понять почему если скейл анимированный, т.е. медленно ползет от 1 до 3, скейл сходит с ума.
import com.greensock.*; import com.greensock.easing.*; function scaleAroundPoint(target:DisplayObject, point:Point, scaleFactor:Number) { var m:Matrix = target.transform.matrix; m.translate(-point.x, -point.y); m.scale(scaleFactor, scaleFactor); m.translate(point.x, point.y); target.transform.matrix = m; } var scale:Number = mc.scaleX; TweenMax.to(this, 5, {scale:3, onUpdate:update}); function update() { scaleAroundPoint(mc, new Point(300, 300), scale); } Когда однократно вызываешь метод, передавая туда финальное значение скейла, то все нормально. |
|
|||||
Регистрация: Jan 2013
Сообщений: 322
|
Vlad84, юзани TweenMax.to({scale: 1}, 5, {scale:3, onUpdate:update});
|
|
|||||
Lorem ipsum
|
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Jul 2012
Сообщений: 148
|
В этом случае смещение считается некорректно, объект при скейле уезжает в левый верхний угол.
|
|
|||||
Lorem ipsum
|
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Jul 2012
Сообщений: 148
|
Фиксируется в (0,0) на стейдже
Последний раз редактировалось Vlad84; 13.01.2015 в 16:07. |
|
|||||
Lorem ipsum
|
Короче вот:
import flash.geom.Matrix; import flash.display.Bitmap; import flash.geom.Point; import flash.events.Event; var bmp:Bitmap = new Bitmap(new BMP()); bmp.x = (stage.stageWidth - bmp.width) / 2; bmp.y = (stage.stageHeight - bmp.height) / 2; addChild(bmp); var mtx:Matrix = bmp.transform.matrix; var pt:Point = new Point(stage.stageWidth / 2 - 100, stage.stageHeight / 2 - 100); var scale:Number = 0.0; addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); function onEnterFrameHandler(event:Event):void { scale += 0.01; scale <= 1.0 && scaleAroundPoint(bmp, pt, scale); } function scaleAroundPoint(target:DisplayObject, point:Point, scaleFactor:Number) { var m:Matrix = mtx.clone(); m.translate(-point.x, -point.y); m.scale(scaleFactor, scaleFactor); m.translate(point.x, point.y); target.transform.matrix = m; }
__________________
Поймай яблоко 2! |
|
|||||
Как раз короткую статью готовлю по трансформациям, но придется поспойлерить.
private function scaleAround(m:Matrix, p:Point, sx:Number, sy:Number):Matrix { var d:Point = m.deltaTransformPoint(p); var i:Point = new Point(m.a, m.b); var j:Point = new Point(m.c, m.d); i.normalize(sx); j.normalize(sy); m.a = i.x; m.b = i.y; m.c = j.x; m.d = j.y; d = d.subtract(m.deltaTransformPoint(p)); m.translate(d.x, d.y); return m; }
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
alatar неправильно
нужна не нормализация, а умножение. так как нужна интерполяция положения точек, а не приведение их к длине простой вариант: private function scaleAround (m:Matrix, p:Point, sx:Number, sy:Number):Matrix { var a:Number = m.a * sx; var b:Number = m.b * sx; var c:Number = m.c * sy; var d:Number = m.d * sy; m.tx += (m.a - a) * p.x + (m.c - c) * p.y; m.ty += (m.b - b) * p.x + (m.d - d) * p.y; m.a = a; m.b = b; m.c = c; m.d = d; return m; } |
|
|||||
Цитата:
Вектор {m.a, m.b} описывает локальную ось x, поворот и масштаб. Длина этого вектора описывает масштаб по оси x. То что у вас получилось... в общем ерунда получилась. Попробуйте подать на вход матрицу с масштабированием и поворотом. Добавлено через 4 минуты http://www.flasher.ru/forum/blog.php?b=703
__________________
משיח לא בא משיח גם לא מטלפן |
Часовой пояс GMT +4, время: 10:56. |
|
« Предыдущая тема | Следующая тема » |
|
|