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

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

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

Регистрация: Sep 2005
Сообщений: 50
Question away3d objectContainers

Помогайте, кто чем может )

На сцене есть 2 контейнера (ObjectContainer).

objectContainer1 и objectContainer2

В objectContainer1 есть объект plane.

Задача - перенести объект plane из objectContainer1 в objectContainer2, но так, чтобы положение и поворот plane остались неизменными. т.е., чтобы plane не изменил своего положения. Нужно это для последующей анимации plane в objectContainer2, т.е. чтобы plane плавно переместился из заданной позиции objectContainer1 в заданную позицию objectContainer2

Есть 2 решения:


Решение 1:

1. Получить глобальные координаты (coords1) plane пока он находится в objectContainer1
2. Перенести plane в objectContainer2
3. Получить глобальные координаты (coords2) plane пока он находится в objectContainer2
4. Удалить plane из objectContainer2
5. Анимировать plane из coords1 в coords2
6. Перенести plane в objectContainer2

Это решение реализуемо, но не годится, т.к. нужно, чтобы plane сразу стал объектом в objectContainer2

Решение 2:

1. Перенести plane в objectContainer2, но так, чтобы plane остался в предыдущей позиции (Вот тут вся загвоздка)
2. Анимировать plane в objectContainer2


P.S.

Вывести plane из objectContainer1 так, чтобы plane оставался на месте я могу.

Примерно так:

Код:
var rot = Matrix3D.matrix2euler(plane.sceneTransform);
var pos = plane.scenePosition;

objectContainer1.removeChild(plane);
			
scene.addChild(plane);
			
plane.x = pos.x;
plane.y = pos.y;
plane.z = pos.z;

plane.rotationX = rot.x;
plane.rotationY = rot.y;
plane.rotationZ = rot.z;
При этом plane уйдёт из objectContainer1, но останется на своей позиции

Как прицепить его к objectContainer2, чтобы он оставался в этой же позиции неясно (

В общем нужно по известному глобальному (x,y,z и rotX, rotY, rotZ) для objectContainer2 и глобальному (x,y,z и rotX, rotY, rotZ) для plane получить локальные (x,y,z и rotX, rotY, rotZ) для plane в objectContainer2

P.P.S Спасибо за внимание


Последний раз редактировалось nauroman; 27.08.2007 в 11:18.
Старый 27.08.2007, 09:25
zafod вне форума Посмотреть профиль Отправить личное сообщение для zafod Найти все сообщения от zafod
  № 2  
Ответить с цитированием
zafod

Регистрация: May 2007
Сообщений: 116
если нужно оставить координаты неизменными, относительно сцены, то пользуй localTOGLobal и globalToLocal.
А вообще можно так еще ( набросок )
Если plain лежит в либе.
Аттачишь plain в ObjectContainer2 потом
Код:
for( i in ObjectContainer2.plain )
ObjectContainer2.plain[i] = ObjectContainer1.plain[i];

var myPt = new flash.geom.Point();
ObjectContainer1.plain.localToGlobal( myPt );
ObjectContainer2.plain.globalToLocal( myPt );
что то типа этого, goto Flash8 Help если что

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

Регистрация: Sep 2005
Сообщений: 50
Я говорю про away3d, про :

plane.x
plane.y
plane.z

plane.rotationX
plane.rotationY
plane.rotationZ

т.е. речь идёт о 3d координатах, и AS3 )

Старый 27.08.2007, 10:44
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
nauroman, отредактируйте свой пост и оформите код тегами [code][/code].

Старый 27.08.2007, 20:30
Amon Duul вне форума Посмотреть профиль Отправить личное сообщение для Amon Duul Посетить домашнюю страницу Amon Duul Найти все сообщения от Amon Duul
  № 5  
Ответить с цитированием
Amon Duul
 
Аватар для Amon Duul

Регистрация: May 2007
Адрес: Kiev
Сообщений: 31
Что-то вроде
Код:
plane.transform = Matrix3D.multiply(Matrix3D.inverse(newcontainer.transform), Matrix3D.multiply(oldcontainer.transform, plane.transform));
должно сработать.
__________________
Away3D | Aviary

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

Регистрация: Sep 2005
Сообщений: 50
РАБОТАЕТ. Спасибо большое.

В результете выглядит примерно так:

Код:
...
public class AnimObjectContainer3D extends ObjectContainer3D
{
    public function AnimObjectContainer3D(init:Object = null)
    {
        super(init);
    }

    override public function addChild(param_child:Object3D):void
    {
			
        if (param_child.parent != null)
       {
           var prevTransform = Matrix3D.multiply(param_child.parent.transform, param_child.transform);
       }
			
       super.addChild(param_child);
			
       if (prevTransform != null)
       {
           param_child.transform = Matrix3D.multiply(Matrix3D.inverse(transform), prevTransform);
       }
...

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

Регистрация: Sep 2005
Сообщений: 50
Хотя нет, вру. Не работает.

т.е. после
Код:
...
public class AnimObjectContainer3D extends ObjectContainer3D
{
    public function AnimObjectContainer3D(init:Object = null)
    {
        super(init);
    }

    override public function addChild(param_child:Object3D):void
    {
			
        if (param_child.parent != null)
       {
           var prevTransform = Matrix3D.multiply(param_child.parent.transform, param_child.transform);
       }
			
       super.addChild(param_child);
			
       if (prevTransform != null)
       {
           param_child.transform = Matrix3D.multiply(Matrix3D.inverse(transform), prevTransform);
       }
...
param_child остаётся в своей позиции, типа всё ok,но если после этого выполнить

Код:
param_child.rotationX = param_child.rotationX;
param_child.rotationY = param_child.rotationY;
param_child.rotationZ = param_child.rotationZ;
то вращение param_child сбивается, и такой код

Код:
var rot = Matrix3D.matrix2euler(param_child.transform);
param_child.rotationX = rot.x;
param_child.rotationY = rot.y;
param_child.rotationZ = rot.z;
не помогает

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

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

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


 


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


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