![]() |
|
||||||||||
|
|
|
|||||
|
Требуется сделать вот что:
Что то типа пространства, в котором в воздухе висят кружочки, и в этом пространстве можно поворачиваться по горизонтали (крутить головой влево-вправо). Кружочки деформациям подвергаться не должны. Как я это дело представляю: если представить это дело в проекции камеры сверху - всё элементарно просто: двигаю каждый из кружков по надобности по формулам из школы: Когда перехожу к пространству возникают проблемы - у меня голова никак не может сообразить, как это дело сделать. Сижу 2 вечер =\ Теория, до которой допёр: Можно видеть лишь 1/4 возможных положений частицы в пространстве. Область просмотра 90 градусов, значит делаем частицу невидимой, если угол между наблюдателем и частицой не лежит в пределах угол поворота+90. С этим всё понятно. Делаю частицу и двигаю её, всё хорошо. Камасутра начинается когда частицы 2, и они находятся на разных растояниях от наблюдателя. Единственное что приходит в голову - это где coff зависит от расстояния до наблюдателя, но подход похоже не годится вовсе - нету какого-то коэфицента, при котором смотрелось бы симпатично - чаще одна из частиц что подальше успевает сделать 1.5-2 оборота, пока первая кое как доползает до конца. Есть какие нибудь идеи, как сделать?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
имо в этой ситуации по-любому надо хранить 3D координаты частиц, тогда все логично и просто,
поиграйся с таким раскладом 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); } } } 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; } } } |
|
|||||
|
Ого, прям с кодом) Спасибо большое, сейчас посмотрю
![]()
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Да, всё здорово - только меня маленько муза посетила и я закончил свой вариант.
Мне кажется в обоих вариантах - ну что то явно прям не айс... Вот ключевые моменты моего варианта: Я задаю точку, где нахожусь я и точку, где находится звезда, нахожу расстояние между мной и звездой и угол: _dist = Point.distance(_thisPoint, _center); _offsetAngle = Math.atan2(_thisPoint.y - _center.y, _thisPoint.x - _center.x); 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; Как то оба варианта "так себе", хотя твой видится более перспективным. Попробую его ковырять конкретно.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Lorem ipsum
|
интересно откуда у тебя параллакс, если твоя голова только поворачивается, но не перемещается, а?
__________________
Поймай яблоко 2! |
|
|||||
|
Цитата:
Добавлено через 18 минут Хм..склоняюсь к мысли,что наверное всё лучше сделать в 3д-позиционировании, т.к. было решено добавить возможность движение камеры в пространстве. Есть у кого нибудь почитать что нибудь сьедобное про это?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Lorem ipsum
|
может неправильно выразился. я о том эффекте, который заставляет шарики двигаться относительно друг друга. такого при панорамном обзоре из одной точки быть не должно.
__________________
Поймай яблоко 2! |
|
|||||
|
А они относительно друг друга и не двигаются - нужно только относительно камеры.
Хотя, уже не актуально - камера будет двигаться.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Lorem ipsum
|
актуально, если ты будешь работать на этом же движке.
у тебя при повороте головы визуально шарики двигаются относительно друг друга — обнаружил бы этот баг пока не поздно ![]()
__________________
Поймай яблоко 2! |
|
|||||
|
Поломав голову решил, что нафиг изобретать велосипед и обнаружил замечательные классы Sprite2D у Sandy и Five3D, как раз то что мне нужно. Теперь вот не знаю, какой движок выбрать =)
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:33. |
|
|
« Предыдущая тема | Следующая тема » |
|
|