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

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

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

Регистрация: Apr 2009
Сообщений: 409
По умолчанию Прямая кинематика

День добрый, имеется массив точек, координаты и углы которых указаны относительно родителя.
Код AS3:
[{name:'root',x:0,y:0,angle:0},
{name:'branch1', x:0, y:100, angle:0, parent:'root'},
{name:'branch2', x:100, y:0, angle:10, parent:'branch1'}]
Задача - в каждый момент времени получить для каждой точки абсолютную матрицу трансформации(например относительно stage)
Объект Joint представляю себе примерно так:
Код AS3:
public function Joint(x:int,y:int,angle:Number, parent:Joint=null){
var parent:Joint=parent;
var transform:Matrix=new Matrix().createBox(1,1,angle||0,x||0,y||0);
}
public function getRelativeTranform(){
/*????*/
}
Можно было бы использовать вложенные displayObjectContainer(как рабоатет это там?), Но штука должна работать максимально быстро, и не хочется тянуть ничего лишнего.
p.s Относительные координаты постоянно меняются

Старый 15.03.2015, 20:41
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
  1. Матрица трансформаций относится к экранному объекту в целом, а не к конкретной точке в его локальном пространстве.
  2. Получить абсолютную матрицу для экранного объекта можно путём перемножения всех матриц его родителей и его самого.
  3. Матрица каждого экранного объекта находится в его свойстве transform.

Я бы лучше посоветовал воспользовался готовыми методами: locatoToGlobal и globalToLocal для получения координат. В случае с самостоятельными расчётами, вам потом ещё придётся умножить конечные точки на абсолютную матрицу, что-бы получить итоговый результат.
__________________
Дети не должны знать о своих родителях

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

Регистрация: Apr 2009
Сообщений: 409
1.Это понятно, но у меня точка в пространстве и есть отдельный объект.
2.Видимо тут имеет значение порядок. Если перемножать рекурсивно сверху вниз, получаются косяки небольшие, но в целом похоже. Сейчас попробую снизу вверх.
Код AS3:
	public function calcChildTransform(parentTransform:Matrix,result:Object) {
var matrix:Matrix = parentTransform.clone();
matrix.rotate((baseTransform.r) * Math.PI / 180);
matrix.translate(baseTransform.x, baseTransform.y);
result[name]=matrix;
}
3. Это мне известно)

locatoToGlobal - вернет только x,y . Вращение все равно нужно будет вычислять вручную.
UPD , да обход снизу вверх - исправил ситуацию, Спасибо, теперь считается правильно. Смущает только то, что теперь нельзя обсчитать все за один обход( В ObjectContatiner это так же реализовано?


Последний раз редактировалось faraday; 15.03.2015 в 21:29.
Старый 16.03.2015, 16:04
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Можно подробней про один проход, почему нельзя?
__________________
Поймай яблоко 2!

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

Регистрация: Apr 2009
Сообщений: 409
Нужно подняться вверз из каждого узла. то есть многие узлы будут пройдены по несколько раз.

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

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Кэширование матриц решит. Допустим есть дерево, (root)-(parent)-(child1, child2, child3). Лишь первый раз мы рекурсивно пройдемся от child1 к root и в каждом элементе (хотя в данном случае это нужно только для parent, но мы же рассматриваем общий алгоритм) закэшируем полученный результат — матрицу относительно stage. После этого child2 и child3 уже не будут бегать вверх, а лишь используют кэшированную (прямую или обратную, в зависимости от задач) матрицу своего родителя — объекта parent.

Добавлено через 1 минуту
Разумеется, это лишь один из вариантов. Как правило подобное кэширование происходит сверху-вниз по инициативе родителя, когда он трансформируется, что и приводит к необходимости пересчитать stageMatrix у всех детей. Но это уже совсем общий подход. Можно сделать и так, чтобы сразу привыкать к хорошему
__________________
Поймай яблоко 2!

Старый 16.03.2015, 22:40
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 7  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Я бы вообще хранил 2 матрицы на объект - относительную и абсолютную. Ну и да, как правильно заметил Zebestov, кеширование не повредит.
__________________
...вселенская грусть

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

Регистрация: Apr 2009
Сообщений: 409
Да, спасибо. Но во время анмаиции каждый узел обновляется по enterFrame, соответтственно и пересчет в глобальные координаты. Так что кеширование тут не даст ощутимого результата.

Добавлено через 28 минут
И еще вопрос, как правильно в виде матрицы записать следующее преобразование:
Код AS3:
 
var attachment:Sprite = new Sprite();
var cont:Sprite = new Sprite();
cont.addChild(attachment);
attachment.x = -attachment.width / 2;
attachment.y = -attachment.height / 2;
cont.rotation = rotation;
cont.x = offsetX;
cont.y = offsetY;
cont.scaleY = -1;
То есть нужно повернуть по центру объект, а потом сместить его и флипнуть по высоте. Никак не могу понять правильный порядок операций

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

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от faraday Посмотреть сообщение
…кеширование тут не даст ощутимого результата
Вообще-то даст. И тем более ощутимым будет этот результат, чем больше будет детей и чем глубже будет вложенность.

Цитата:
Сообщение от faraday Посмотреть сообщение
И еще вопрос … нужно повернуть по центру объект, а потом сместить его и флипнуть по высоте. Никак не могу понять правильный порядок операций
Код AS3:
// готовим матрицу
var matrix:Matrix = new Matrix();
    matrix.translate(-attachment.width / 2, -attachment.height / 2);
    matrix.scale(1, -1);     // если нужно сначала повернуть, а лишь потом флипнуть
    matrix.rotate(rotation); // следует поменять местами эти две строки
    matrix.translate(offsetX, offsetY);
 
// применяем матрицу (как видно, cont и не нужен вовсе)
attachment.transform.matrix = matrix;
Но это частный случай трансформации свежесозданного экранного объекта.
Более наглядно и, в то же время, подробно здесь.
__________________
Поймай яблоко 2!

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

Регистрация: Apr 2009
Сообщений: 409
Спасибо)

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

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

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


 


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


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