PDA

Просмотр полной версии : Set transformation point программно


bumb0x
28.12.2010, 13:02
Здравствуйте, такой вопрос: можно ли программно задавать координаты точки преобразования?

iflamberg
28.12.2010, 13:15
Нет. Много раз обсуждалось. Попробуйте погуглить или поиск по форуму.

Hidest
28.12.2010, 13:53
Еще один кандидат на прикрепленную тему... Хотя, таких частых тем полно, будет первая страница вся в прикрепленных...

Программно нельзя, используйте контейнер, в котором смещайте свой клип как вам надо, а в дальнейшем странсформируйте уже контейнер как надо.

drnet_ua
28.12.2010, 14:04
можно, но проще поместить его в спрайт и сместить как надо.

Добавлено через 4 минуты
вот решение попроще (http://www.oscartrelles.com/archives/dynamic_movieclip_registration_with_as3)

Hidest
28.12.2010, 14:27
Это просто имитация, сама точка регистрации клипа никуда не смещается. То же самое можно сделать через матрицы трансформации.

Все подобные решения являются заменой, а не реальным изменением точки (можно просто все чайлды клипа еще подвинуть как надо), хотя эти действия и приводят к нужному результату.


UPD: блин, речь же о точке трансформации, а не о точке регистрации. Тогда да, в таком контексте можно.

alatar
28.12.2010, 14:51
Все подобные решения являются заменой, а не реальным изменением точки
Нет никакой точки, соответсвенно не может быть "реального" или "нереального" ее изменения.

Hidest
28.12.2010, 15:37
Я уже написал, что сначала писал о точке регистации, а потом понял, что нужна была точка трансформации.. В Flash IDE при трансформации вручную можно эту точку перемещаться как хочется. Автору нужно было именно это, насколько я понял. Но вот никакого метода setTransfomationPoint() у нас, естественно нет, поэтому я и сказал про имитацию именно функционала IDE. Естественно, что точка, относительно которой происходит трансформмирование - понятие абстрактное.

drnet_ua
28.12.2010, 18:41
точка есть. это точка (0,0). сдвинуть ее нельзя, можно сдвинуть все остальное относительно ее.

при особом желании можно все содержимое обьекта сдвинуть поштучно, а потом сдвинуть то что получилось, но это геморой.

вращение например, через матрицу делают, но у меня с первого раза не получилось :) пришел к тому что порекомендовал Hidest

alatar
28.12.2010, 18:49
точка есть. это точка (0,0). сдвинуть ее нельзя, можно сдвинуть все остальное относительно ее.
Это не точка, а начало координатных осей. Ну или их пересечение.
вращение например, через матрицу делают, но у меня с первого раза не получилось пришел к тому что порекомендовал Hidest
С матрицами все просто (по сути особой разницы с контейнером нет, за исключением контейнера). Сначала матрицу трансформации объекта надо обнулить (по-сути все трансформации объекта происходят через матрицы). Потом сдвигаем матрицу в нужные локальные координаты объекта. Трансформируем матрицу. Сдвигаем обратно в 0, 0 (либо учитываем сдвиг на следующем шаге). И сдвигаем обратно в координаты в которых объект был до трансформации.

passertm
28.12.2010, 18:53
на счет частозадаваемых вопросов не былобы лучше сделать одну прикрепленную тему и там списком давать ссылки на частозадаваемые вопросы. это решилобы часть вопросов.

alatar
28.12.2010, 18:55
это решилобы часть вопросов.
Ага, так же как поиск по форуму. :)

Dukobpa3
28.12.2010, 18:56
Присоединюсь к вопросу автора.

alatar, просто с матрицами, да не просто:)
К примеру я с успехом применяю матрицу для смещений всяких. Вращение тоже работает ок - пматрицей ноль клипа передвинул и ок.

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

passertm
28.12.2010, 19:24
Ага, так же как поиск по форуму. :)
ну. согласитесь, поиск это не faq. очень часто бывают темы которые то ли не знаешь как искать. то ли поиск выдает кучу тем не относяшихся к делу

alatar
29.12.2010, 01:05
А вот со скейлами полдня промучался и ничего не получилось.
Просто надо учесть, что линейные размеры при увеличении меняются и скорректировать координаты.

package
{
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.net.URLRequest;
import flash.system.System;

public class asTest extends Sprite
{
private var _sprite:Sprite = new Sprite();

public function asTest()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

draw(_sprite.graphics);

_sprite.x = 100;
_sprite.y = 100;

addChild(_sprite);
_sprite.addEventListener(MouseEvent.CLICK, scaleAroundPoint);
}

private function draw(gr:Graphics):void
{
gr.beginFill(Math.random()*0xFFFFFF);
gr.drawRect(0, 0, 50, 50);
gr.endFill();
}

private var scale:Number = 2;

private function scaleAroundPoint(event:MouseEvent):void
{
scale++;

var target:DisplayObject = DisplayObject(event.currentTarget);

//точка вращения
var transformPoint:Point = new Point(25, 25);

var unscaledWidth:Number = target.width / target.scaleX;
var unscaledHeight:Number = target.height / target.scaleY;

var offsetX:Number = transformPoint.x / unscaledWidth;
var offsetY:Number = transformPoint.y / unscaledHeight;

/* корректируем координаты объекта.
Необходимо восстановить координаты объекта относитльно
точки вращения без увеличения */
var targetX:Number = target.x + target.width * offsetX - target.width * offsetX / target.scaleX;
var targetY:Number = target.y + target.height * offsetY - target.height * offsetY / target.scaleY;

var m:Matrix = new Matrix();

m.translate(-transformPoint.x, -transformPoint.y);
m.scale(scale, scale);
m.translate(transformPoint.x, transformPoint.y);
m.translate(targetX, targetY);

target.transform.matrix = m;
}
}
}

Dukobpa3
29.12.2010, 01:12
Спасибо Кэп, я именно так и сделал:)

Вопрос не про "подогнать по пикселам после скейла", а в том что если делать это в ИДЕ - то смена центра влияет и на центр скейла.
Кодом у меня это сделать не получилось, кроме как подогнать так как ты привел в своем примере.

alatar
29.12.2010, 01:15
FlashIDE просто сдвигает содержимое в контейнере относительно 0,0. Что значит не получилось кодом?

Dukobpa3
29.12.2010, 01:24
Не получилось - значит при любых раскладах скейлится из лево-верха - вправо-низ.
И кроме как центровать в процессе - ниче не придумалось.

Хотя я так полагал что скейл работает из точки нуля мувика (черненький крестик в ИДЕ). И вот знатоки вопрос:
- Это я неправильно думаю про скейл и он при любых раскладах таки работает из лево-верха, и пофиг где ноль
- или я прав насчет скейла, но все танцы с матрицей на самом деле делают что-то другое, но не сдвигают ноль
- или я просто что-то не так делал, и скейл у нас должен быть из точки нуля, и матрица должна свигать именно этот ноль.

Wolsh
29.12.2010, 01:41
Длина стороны прямоугольника зависит от того, где находится начало координат?

alatar
29.12.2010, 01:43
Все трансформации работают относительно 0,0 клипа (включая скейл и матрицу).
Матрица сдвигает объект, а не его 0,0.

Dukobpa3
29.12.2010, 02:24
А не все ли равно, сдвинуть ноль относительно объекта (что и звучит то абсурдно), или сдвинуть объект относительно нуля?

В итоге этих действий мы получим(ну это как я себе понимаю) один результат - ноль будет в определенной точке клипа (не лево-верх клипа, но что-то другое).

alatar
29.12.2010, 02:32
Ноль всегда будет в нуле, ложки нет никаких верхов-низов. Другое дело, что содержимое этого клипа может находиться в отрицательных координатах. Так вот, матрица на содержимое клипа тоже никак не влияет, в том смысле, что не сдвигает относительно нуля клипа.

Dukobpa3
29.12.2010, 02:40
О. теперь понял.

Так а на что же тогда влияет матрица? Куда там она что двигает?

alatar
29.12.2010, 02:43
Она смещает сам объект в родительских координатах. При поворотах объекта создается иллюзия, что объект повернулся относительно некоторой точки.

Dukobpa3
29.12.2010, 02:50
Т.е. получается чтобы действительно сдвинуть центр - нам нужно делать какой-то спрайт-обертку. И интересующий нас спрайт пихать в эту обертку с отрицательными координатами нашего нужного центра?:)
Только так?

(Я вообще поначалу только так и делал, пока не узнал что такое матрица и с чем ее едят, считал правда этот метод унылым чуть менее чем полностью в виду потребности плодить дополнительный спрайт. Потом научился пользоваться матрицей, от этого отказался. А теперь выясняется что не настолько этот метод и уныл)

alatar
29.12.2010, 03:02
Ничего унылого в этом методе нет, за исключением лишнего контейнера (если он делается только для трансформаций). Но сам плеер работает через матрицы, по-крайней мере матрица влияет на x, y, width, height, scaleX, scaleY и наоборот, эти параметры влияют на матрицу.

Dukobpa3
29.12.2010, 03:06
Ок, спасибо.

Ура, товарищи, истина найдена:)
Держи плюс в карму:)