Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Particles, псевдо 3д (http://www.flasher.ru/forum/showthread.php?t=138391)

Psycho Tiger 06.04.2010 19:27

Particles, псевдо 3д
 
Требуется сделать вот что:
Что то типа пространства, в котором в воздухе висят кружочки, и в этом пространстве можно поворачиваться по горизонтали (крутить головой влево-вправо). Кружочки деформациям подвергаться не должны.
Как я это дело представляю:
если представить это дело в проекции камеры сверху - всё элементарно просто: двигаю каждый из кружков по надобности по формулам из школы:
Код AS3:

x=Math.cos(angle)*100;
y=Math.sin(angle)*100;

Когда перехожу к пространству возникают проблемы - у меня голова никак не может сообразить, как это дело сделать. Сижу 2 вечер =\

Теория, до которой допёр:
Можно видеть лишь 1/4 возможных положений частицы в пространстве. Область просмотра 90 градусов, значит делаем частицу невидимой, если угол между наблюдателем и частицой не лежит в пределах угол поворота+90. С этим всё понятно.
Делаю частицу и двигаю её, всё хорошо. Камасутра начинается когда частицы 2, и они находятся на разных растояниях от наблюдателя. Единственное что приходит в голову - это
Код AS3:

_x = Math.sin(_viewerAngle / coff);

где coff зависит от расстояния до наблюдателя, но подход похоже не годится вовсе - нету какого-то коэфицента, при котором смотрелось бы симпатично - чаще одна из частиц что подальше успевает сделать 1.5-2 оборота, пока первая кое как доползает до конца.

Есть какие нибудь идеи, как сделать?

silin 06.04.2010 20:56

имо в этой ситуации по-любому надо хранить 3D координаты частиц, тогда все логично и просто,
поиграйся с таким раскладом
Код AS3:

package 
{
        import flash.display.*;
        import flash.events.*;
        import flash.ui.*;
 
        public class Main extends Sprite
        {
                private var _stars:Array = [];
                private var _num:int = 200;
 
                public function Main():void
                {
                        for (var i:int = 0; i < _num; i++)
                        {
                                var star:Star = new Star();
                                _stars.push(star);
                                addChild(star);
                        }
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
                }
 
                private function onKeyDown(event:KeyboardEvent):void
                {
                        if (event.keyCode == Keyboard.LEFT) rotate( -0.01);
                        if (event.keyCode == Keyboard.RIGHT) rotate( 0.01);
                }
 
                private function rotate(angle:Number):void
                {
                        for (var i:int = 0; i < _num; i++) (_stars[i] as Star).rotate(angle);
 
                }
        }
}

Код AS3:

package  
{
        import flash.display.*;
        import flash.geom.*;
 
        public class Star extends Shape
        {
                public static const RADIUS:Number = 500;
                public static const CENTER:Point = new Point(250, 250);
                //3D координаты
                private var _pX:Number;
                private var _pY:Number;
                private var _pZ:Number;
 
 
                public function Star()
                {
                        graphics.lineStyle(4, 0xFFFFFF);
                        graphics.lineTo(0.5, 0);
 
                        _pX = 2 * RADIUS * (0.5 - Math.random());
                        _pY = 2 * RADIUS * (0.5 - Math.random());
                        _pZ = 2 * RADIUS * (0.5 - Math.random());
                        rotate(0);
                }
 
                public function rotate(angle:Number):void
                {
                        var sin:Number = Math.sin(angle);
                        var cos:Number = Math.cos(angle);
                        var ty:Number = _pX;
 
                        _pX = _pX * cos + _pZ * sin;
                        _pZ = _pZ * cos - ty * sin;
 
                        x = CENTER.x + _pX;
                        y = CENTER.y + _pY;
                        scaleX = scaleY = RADIUS / (RADIUS - _pZ);
 
                        var viewAngle:Number = Math.atan2(_pZ, _pX);
                        visible = viewAngle < 0;
                }
        }
}


Psycho Tiger 06.04.2010 21:26

Ого, прям с кодом) Спасибо большое, сейчас посмотрю :)

Psycho Tiger 06.04.2010 22:30

Вложений: 1
Да, всё здорово - только меня маленько муза посетила и я закончил свой вариант.
Мне кажется в обоих вариантах - ну что то явно прям не айс...
Вот ключевые моменты моего варианта:
Я задаю точку, где нахожусь я и точку, где находится звезда, нахожу расстояние между мной и звездой и угол:
Код AS3:

_dist = Point.distance(_thisPoint, _center);
_offsetAngle = Math.atan2(_thisPoint.y - _center.y, _thisPoint.x - _center.x);

А после для отображения: (_viewerAngle - угол поворота камеры у игрока)
Код AS3:

var s:Number = _viewerAngle + _offsetAngle;
var cos:Number = Math.cos(s);
var sin:Number = Math.sin(s);
_visible = (sin<0 && cos>0);
 
_x3D = cos * (MainConfig.WIDTH+_particle.width);
_size = (WorldConfig.MAX_DISTANCE_FROM_SPARK - _dist) / 100;

Имена констант говорят за себя... получилось вот что (см. аттач).

Как то оба варианта "так себе", хотя твой видится более перспективным. Попробую его ковырять конкретно.

Zebestov 06.04.2010 22:38

интересно откуда у тебя параллакс, если твоя голова только поворачивается, но не перемещается, а?

Psycho Tiger 06.04.2010 23:02

Цитата:

Сообщение от Zebestov (Сообщение 898500)
интересно откуда у тебя параллакс, если твоя голова только поворачивается, но не перемещается, а?

Это где ты параллакс увидел?

Добавлено через 18 минут
Хм..склоняюсь к мысли,что наверное всё лучше сделать в 3д-позиционировании, т.к. было решено добавить возможность движение камеры в пространстве.
Есть у кого нибудь почитать что нибудь сьедобное про это?

Zebestov 06.04.2010 23:28

Цитата:

Сообщение от Psycho Tiger (Сообщение 898504)
Это где ты параллакс увидел?

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

Psycho Tiger 06.04.2010 23:54

А они относительно друг друга и не двигаются - нужно только относительно камеры.
Хотя, уже не актуально - камера будет двигаться.

Zebestov 07.04.2010 00:32

актуально, если ты будешь работать на этом же движке.
у тебя при повороте головы визуально шарики двигаются относительно друг друга — обнаружил бы этот баг пока не поздно ;)

Psycho Tiger 07.04.2010 14:59

Поломав голову решил, что нафиг изобретать велосипед и обнаружил замечательные классы Sprite2D у Sandy и Five3D, как раз то что мне нужно. Теперь вот не знаю, какой движок выбрать =)


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

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