Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.01.2015, 13:38
Vlad84 вне форума Посмотреть профиль Отправить личное сообщение для Vlad84 Найти все сообщения от Vlad84
  № 1  
Ответить с цитированием
Vlad84

Регистрация: Jul 2012
Сообщений: 148
По умолчанию Скейл относительно точки

Не могу понять почему если скейл анимированный, т.е. медленно ползет от 1 до 3, скейл сходит с ума.
Код AS3:
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);
}

Когда однократно вызываешь метод, передавая туда финальное значение скейла, то все нормально.
Код AS3:
scaleAroundPoint(mc, new Point(300, 300), 3);

Старый 13.01.2015, 14:26
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 2  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
Vlad84, юзани TweenMax.to({scale: 1}, 5, {scale:3, onUpdate:update});

Старый 13.01.2015, 14:37
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 3  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Попробуй там заменить:
Код AS3:
var m:Matrix = new Matrix();
__________________
Поймай яблоко 2!

Старый 13.01.2015, 15:15
Vlad84 вне форума Посмотреть профиль Отправить личное сообщение для Vlad84 Найти все сообщения от Vlad84
  № 4  
Ответить с цитированием
Vlad84

Регистрация: Jul 2012
Сообщений: 148
Цитата:
Сообщение от Zebestov Посмотреть сообщение
Попробуй там заменить:
Код AS3:
var m:Matrix = new Matrix();
В этом случае смещение считается некорректно, объект при скейле уезжает в левый верхний угол.

Старый 13.01.2015, 15:27
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Наверное, потому что надо еще:
Код AS3:
m.translate(point.x * scaleFactor, point.y * scaleFactor);
__________________
Поймай яблоко 2!

Старый 13.01.2015, 15:51
Vlad84 вне форума Посмотреть профиль Отправить личное сообщение для Vlad84 Найти все сообщения от Vlad84
  № 6  
Ответить с цитированием
Vlad84

Регистрация: Jul 2012
Сообщений: 148
Цитата:
Сообщение от Zebestov Посмотреть сообщение
Наверное, потому что надо еще:
Код AS3:
m.translate(point.x * scaleFactor, point.y * scaleFactor);
Фиксируется в (0,0) на стейдже
Вложения
Тип файла: zip scale_around_point - Copy.zip (6.4 Кб, 12 просмотров)


Последний раз редактировалось Vlad84; 13.01.2015 в 16:07.
Старый 13.01.2015, 16:01
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 7  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Короче вот:

Код AS3:
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!

Старый 13.01.2015, 23:21
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Как раз короткую статью готовлю по трансформациям, но придется поспойлерить.
Код AS3:
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;
}
m - матрица трансформации объекта, p - точка вокруг которой происходит трансформация (в локальных координатах объекта), sx, sy - масштаб по осям.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 14.01.2015, 01:55
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 9  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
alatar неправильно
нужна не нормализация, а умножение. так как нужна интерполяция положения точек, а не приведение их к длине
простой вариант:
Код AS3:
		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;
		}

Старый 14.01.2015, 02:18
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 10  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Сообщение от Nooob Посмотреть сообщение
alatar неправильно
нужна не нормализация, а умножение. так как нужна интерполяция положения точек, а не приведение их к длине
Вы свой простой вариант проверяли?
Вектор {m.a, m.b} описывает локальную ось x, поворот и масштаб. Длина этого вектора описывает масштаб по оси x. То что у вас получилось... в общем ерунда получилась. Попробуйте подать на вход матрицу с масштабированием и поворотом.

Добавлено через 4 минуты
http://www.flasher.ru/forum/blog.php?b=703
__________________
משיח לא בא
משיח גם לא מטלפן

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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