Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   позиционирование в 3D (http://www.flasher.ru/forum/showthread.php?t=117107)

DRAGOnoid 19.10.2008 06:39

позиционирование в 3D
 
УРА! :yahoo: наконец во флеше официально вышла поддержка 3D
любой DisplayObject обладает новыми вкусными методамами и свойствами типа sprite.z, sprite.scaleZ, MovieClip.rotationZ;

работают пока крайне глючно - НО РАБОТАЮТ! :quiet:

и всё же пара вещей хотелось бы решить - а именно позиционирование объектов относительно друг друга.

например создавая абсолютно одинаковые по величине объекты но располагая их в разных Z координатах они будут позиционироваться по глубине так как я добавлял их с помощью addChild(); Это логично, но есть ли способ задать им так, чтобы тот что действительно сзади - был сзади а не спереди? Это я простой пример привёл потому что понимаю что можно решить и циклом сортируя по Z но что делать когда объекты поворачиваются с помощью rotationZ - тут что то немогу догадаться как их правильно позиционировать.


если получится решить первый вопрос то будет и второй :away:

__ant 19.10.2008 11:20

Не проверял, но может быть поможет.
http://blog.yesutin.com/?p=246

DRAGOnoid 19.10.2008 14:53

эхх эта штука пашет только при сортировки Z координаты (т.е. чисто положение координат) но вот повороты так и не сортирует
Код:

var ellipse1:Sprite        = new Sprite();
        ellipse1.graphics.beginFill(0xFF0000, 1);
        ellipse1.graphics.drawCircle(0, 0, 60);
        ellipse1.x                =        100;
        ellipse1.y                =        100;
       
       
addChild(ellipse1);

var ellipse2:Sprite        = new Sprite();
        ellipse2.graphics.beginFill(0x00FF00, 1);
        ellipse2.graphics.drawRoundRect(0, 0, 60, 60, 20);
        ellipse2.x                =        110;
        ellipse2.y                =        100;
        ellipse2.z                =        200;
        ellipse2.rotationY        =        -40;
       
addChild(ellipse2);

var ellipse3:Sprite        = new Sprite();
        ellipse3.graphics.beginFill(0x0000FF, 1);
        ellipse3.graphics.drawRoundRect(0, 0, 60, 60, 20);
        ellipse3.x                        =        100;
        ellipse3.y                        =        100;
        ellipse3.z                        =        200;
        ellipse3.rotationY        =        -40;

addChild(ellipse3);

var faces:Array                =        new Array();
        faces.push(ellipse1);
        faces.push(ellipse2);
        faces.push(ellipse3);

for(var ind:uint = 0; ind < 3; ind++) {
        faces[ind].z = faces[ind].transform.getRelativeMatrix3D(root).position.z;
        this.removeChild(faces[ind]);
}
faces.sortOn("z", Array.NUMERIC | Array.DESCENDING);
for (ind = 0; ind < 3; ind++) {
        this.addChild(faces[ind]);
}

а ещё так и не понял откуда взялся параметр child

silin 19.10.2008 15:09

ага, какая-то досадная непонятка в FP10 - отсутствие сортировки детей в 3D пространстве, даже в five3D есть..
может есть, но плохо искал..
ничего более путного не придумал, как сортировать дисплейЛист по расстоянию детей до viewPoint,
пример: http://silin.fatal.ru/#FP10/cube3D

DRAGOnoid 19.10.2008 15:33

Шайтан! :eek:
неплохо вышло ;)
кстати видно по твоему примеру что 3D у них как то пока не очень 3Dшное в плане проецирования - как то они угол обзора не тот выбрали или в общем что то не то... Пока сам не знаю.

как же нехватает мааленького свойства в DisplayObject типа this.enable3Dposition = true :rolleyes:

etc 19.10.2008 20:29

3D вам не обещали, обещали 3D-трансформацию.

lklabs 21.10.2008 23:13

Это называется 2.5D

DRAGOnoid 21.10.2008 23:25

Цитата:

Сообщение от lklabs (Сообщение 771920)
Это называется 2.5D

не. 2.5D - это статичная изометрия со статичными спрайтами. просто выглядит всё как в 3D с зафиксированной камерой.

ashDotDash 22.10.2008 18:46

если алгоритм z-сортировки примерно ясен, то построение пересечений 3D-объектов и обнаружение столкновений страшно представить.

DRAGOnoid 22.10.2008 19:59

Это фигня ещё - ты посмотри движок альтернативы
вот 3д проецирование я и сам делал типа представляю - вот как текстурой обливать что то как то с трудом представляю а ещё чтобы это работало быстро.
как импортировать готовые модели я вообще не представляю.
но у них это всё фигня у них даже работа с источником света есть! О__О

Девид Блейн ??
,--__
О_o
//

Division 22.10.2008 20:05

Цитата:

у них даже работа с источником света есть
Это самая простая часть ИМХО.
Что действительно сложно - это построение(и динамическая перестройка) BSP дерева. Это вам не алгоритм художника (:

DRAGOnoid 22.10.2008 20:10

ага следущий щас зайдёт скажет "да вообще вы фигню обсуждаете!" вот они разрабатывают готовый пакет для создания собственных онлайн игр :-D


решил зайти в кое веки на их сайт
О________________О
я НЕЗНАЛ!!!! ЧЕЕСНА!!!!

можно руганусь фразой "в рот мне ноги!" ??
http://alternativaplatform.com/ru/alternativacore/

всё пошёл вешаться...

ashDotDash 22.10.2008 20:46

Цитата:

Сообщение от DRAGOnoid (Сообщение 772146)
как импортировать готовые модели я вообще не представляю.

Благодаря ByteArray, если знать спецификацию определенного формата файлов с 3d-моделями, можно его спокойно загружать во флэшку и разбирать на нужное.

Division 22.10.2008 20:53

Цитата:

Благодаря ByteArray, если знать спецификацию определенного формата файлов с 3d-моделями, можно его спокойно загружать во флэшку и разбирать на нужное.
А ещё можно написать свой скрипт экспорта из 3D редактора) Тода хоть в бинарный файл, хоть в текстовый, хоть в XML - куда удобно, туда и экспортишь. А загрузить движком уже дело техники. Ох, что-то меня понесло (:

Яски 22.10.2008 21:27

Цитата:

Сообщение от DRAGOnoid (Сообщение 772152)
ага следущий щас зайдёт скажет "да вообще вы фигню обсуждаете!" вот они разрабатывают готовый пакет для создания собственных онлайн игр :-D

Ну вообще-то, платформа для этого и разрабатывалась. Посмотри старую демку http://blog.alternativaplatform.com/...d-engine-demo/

DRAGOnoid 22.10.2008 21:29

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

но вот я решил изменить размер экрана а в настройках сцены стоит
Код:

stage.scaleMode                                        =        StageScaleMode.NO_SCALE;
stage.align                                                =        StageAlign.TOP_LEFT;

объекты как стояли так и стоят - можно ли как то переопределить центр экрана для них (желательно готовым простым способом)?

mre 22.10.2008 21:43

Можно.
Контейнер с объектами располагать по центру stage на RESIZE.

DRAGOnoid 22.10.2008 21:50

Цитата:

Сообщение от mre (Сообщение 772182)
Можно.
Контейнер с объектами располагать по центру stage на RESIZE.

О! хороший план что то сам не догадался пасиб! :quiet:

ой а что делать когда надо определить во сколько раз сжался объект когда мы его перемещали по координате Z ?

iNils 23.10.2008 01:49

Пользователь DRAGOnoid получает предупреждение за глобальное игнорирование запятых.

mre 23.10.2008 03:01

Цитата:

Сообщение от DRAGOnoid (Сообщение 772185)
ой а что делать когда надо определить во сколько раз сжался объект когда мы его перемещали по координате Z ?

Нельзя точно определить, если нет каких-либо границ.
Ведь при z, стремящимся к бесконечности, scale будет стремиться к нулю.

DRAGOnoid 23.10.2008 03:05

не ну это и понятно - я ж не буду делать координату .z = NaN;

mre 23.10.2008 03:06

Дак что Вы конкретно хотите?

DRAGOnoid 23.10.2008 03:21

Код:

var sprite:Sprite        =        new Sprite();
        sprite.graphics.beginFill(0, 0.4);
        sprite.graphics.drawCircle(0,0, 40);
        sprite.x                =        100;
        sprite.y                =        100;
        sprite.z                =        300;
       
addChild(sprite);

trace ('scaleX=' + sprite.scaleX + ' scaleY=' + sprite.scaleY + ' scaleZ=' + sprite.scaleZ);
//        выдаст
//        scaleX=1 scaleY=1 scaleZ=1

но реально то картинка сжалась! можно ли как нить получить этот коэффициент сжатия?

mre 23.10.2008 03:32

Я еще не работал с CS4, но думаю можно, соотнеся текущий видимый занимаемый Rectangle и width, height.
Но зачем?
Если не меняете rotation, используйте scale - будете знать соотношение.

DRAGOnoid 23.10.2008 03:37

Цитата:

Сообщение от mre (Сообщение 772266)
Если не меняете rotation, используйте scale - будете знать соотношение.

ну тогда получается мне проще вернуться к собственному 3D движку, точнее как раз классу который занимается позиционированием объектов в пространстве. Но тогда получается на встроенные методы и свойства типа Z придётся забить. Чего бы очень нехотелось. Да и велосипед изобретать не хотелось бы. лучше всётаки разобраться в встроенных классах - надеюсь они не пропадут а будут только дальше развиваться.

darksranger 23.10.2008 09:42

да не сжалась она

она просто "уехала" визуально и кажется будто она сжалась, на самом деле она осталась прежних размеров просто находится визуально дальше!!! хотите чтоб сжималась, используйте за место отдаления ( z ), scale ...

ashDotDash 26.10.2008 00:53

для определения размеров "уехавшего" объекта относительно экрана проекции можно использовать метод DisplayObject.local3DToGlobal().
Код:

public function local3DToGlobal(point3d:Vector3D):Point
Он преобразовывает координаты 3D-точки к двумерным глобальным координатам относительно Stage.

DRAGOnoid 22.03.2009 16:09

Здравствуйте всем ещё раз. У меня появился новый вопрос, на который что-то никак не могу найти ответ.
Как известно перерасчёт 3D в 2D идёт по двум простым формулам:

Код:

  x2D = x3D * distance / z3D + stageWidth / 2
  y2D = y3D * distance / z3D + stageHeight / 2

Так вот эту констатну distance - флеш как то сама считает в зависимости от ширины экрана. По моему методу научного тыка выяснилось, что расчёт distance идёт что-то в духе

Код:

Math.ceil(stage.stageWidth * 0.88);
Но всётаки может есть нормальный встроенный способ регулировать центр экрана и константу distance?

а то этих вещей критически нехватает...

etc 22.03.2009 16:12

Вообще-то для перевода из 3D в 2D формулы посложнее и совсем не такие.

silin 22.03.2009 16:28

см.
PerspectiveProjection ( DisplayObject.transform.perspectiveProjection )
DisplayObject.local3DToGlobal ()

Яски 22.03.2009 17:55

Этот параметр distance по-дургому называют focalLength(фокальное расстояние) посмотри у объектов perspectiveProjection наверняка есть что-то подобное.

DRAGOnoid 22.03.2009 23:18

Цитата:

Сообщение от silin (Сообщение 807632)
см.
PerspectiveProjection ( DisplayObject.transform.perspectiveProjection )
DisplayObject.local3DToGlobal ()

спасибо - по моему это то что искал, точно незнаю завтра посмотрю....

Добавлено через 1 час 23 минуты
Цитата:

Сообщение от Яски (Сообщение 807648)
Этот параметр distance по-дургому называют focalLength(фокальное расстояние) посмотри у объектов perspectiveProjection наверняка есть что-то подобное.

так оно и оказалось.
к сожалению немогу нигде кроме root найти конструктор perspectiveProjection.
в остальный DisplayObject он везде null :( хотя Это всё логически обоснованно =)
круто! спасибо - он как раз то что надо!

DRAGOnoid 23.04.2009 18:32

спустя некоторое время решил вернуться к этому вопросу.
в общем есть пара методов которые изменяют положение центра и дистанцию до препятствия:
Код AS3:

stage.transform.perspectiveProjection.projectionCenter = new Point(stage.stageWidth/2, stage.stageHeight/2);
stage.transform.perspectiveProjection.focalLength = 1000;

но когда у объекта беру вектор направления
Код AS3:

trace (someSprite.transform.getRelativeMatrix3D(stage).position);

мне возвращается вектор непонятных координат...
так как же определить вектор от объекта к центру экрана?

поясню это ещё нужно для того чтобы определить какой стороной к нам спрайт - лицевой или задней... если зная вектор плоскости и правильный вектор центра экрана получить угол
Код AS3:

a = Vector3D.angleBetween(vectorStage, vectorNormal);

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

подскажете какие нибудь идеи?

gloomyBrain 23.04.2009 20:18

Сори, что не отвечаю на Ваш вопрос, а просто комментирую... НО
Если определение лицевой/обратной стороны спрайта Вам необходимо для создание некоего 3d-движка, то советую еще раз подумать
Почему? - по тому, что уже при 200 спрайтах на простеньком 2-х ядерном Интеле начинаются тормоза. Причем возникают они и при меньшем количестве спрайтов при условии, что в результате перспективного искажения спрайт на экране занимает площадь бОльшую своего номинального размера.
То есть, создавая спрайт размерами 100х100 и приблизив его (z < 0) Вы заставляете флеш его растягивать. Флеш, пытаясь сохранить качество тратит много ресурсов.
Что само по себе не очень =)

DRAGOnoid 24.04.2009 00:07

флеш сам режет графику и более того - я доказал что в нём есть Z буффер который ещё просто тупо не активировали...

удаление граней хочу сделать для вторичной сортировки так скать... для этого надо найти вектор от точки видимости до центра координат объекта.

silin 24.04.2009 00:36

попробуй смотреть getRelativeMatrix3D не относительно stage, а относительно самого верхнего предка
для определения видимости спрайта есть еще такой способ http://www.senocular.com/?id=2.57

DRAGOnoid 24.04.2009 11:28

ты имеешь ввиду root ? да как раз по твоей прошлой наводке использовать getRelativeMatrix3D + root у меня и получилось создать неплохой сортировщик, но нащюпать правильный вектор не удалось... это по сути последнее что осталось разгрести - тогда можно делать полнеоценные 3D махинации =)

З.Ы. есть ли смысл поднять мне топик где с нуля я бы описал как работать с 3D проектированием и что можно от него добиться?

etc 24.04.2009 12:47

Цитата:

Сообщение от DRAGOnoid (Сообщение 815097)
я доказал что в нём есть Z буффер который ещё просто тупо не активировали...

Где, как, когда и при каких обстоятельствах?

DRAGOnoid 24.04.2009 13:32

да просто - когда любой спрайт приближаешь к экрану максимально близко - он начинает обрезаться.. такое возможно только расчётом положений пикселей в пространстве.. ну или тем же Z-буффером который этим и занимается.

etc 24.04.2009 13:58

Это клиппинг, а не Z-буфер.


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

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