Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Параметр stitch в perlinNoise (http://www.flasher.ru/forum/showthread.php?t=138675)

orcpochta 13.04.2010 21:16

Параметр stitch в perlinNoise
 
Цитата:

stitch (Boolean): при значении true этот метод будет стараться сгладить края перехода изображения для создания ровных текстур, которые можно использовать для мозаичной заливки растровым изображением.
Объясните, что происходит при сдвиге параметров offsets при stitch == true и как сделать плавное зацикливание шума Перлина (возможно ли вообще это рассчитать)?

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

Код AS3:

var rows:uint = 3;
var columns:uint = 4;
 
var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE;
var p:Point = new Point( );
 
var bmd:BitmapData = new BitmapData(100, 100, false, 0x00000000);
 
var bmp:Bitmap;
var str:String = "bmp";
 
for (var i:int = 0; i <  rows * columns; i++)
{       
        bmp = this[str + i] = new Bitmap(bmd);
        addChild(bmp);
 
        bmp.y = bmd.height * int(i / columns);
        bmp.x = bmd.width * int(i % columns);
}
 
addEventListener(Event.ENTER_FRAME, enterFrameListener);
 
function enterFrameListener (e:Event):void
{       
        p.x++;
        p.y++;
 
        //уберите эти комментарии при втором просмотре:
        //if (p.x >= bmd.width) p.x = 0;
        //if (p.y >= bmd.height) p.y = 0;
        //здесь я наивно полагал, что размеры битмапдаты и смещение связаны напрямую...)))
 
        bmd.perlinNoise(30, 30, 1, 0, true, true, channels, false, [p]);
}


Wolsh 14.04.2010 19:38

Цитата:

//здесь я наивно полагал, что размеры битмапдаты и смещение связаны напрямую...)))
В том то и дело, что связаны. Исправь условие на if (p.x >= bmd.width - 30) p.x = 0; и увидишь. Будет дергаться конечно, но границы битмапины не попадут в изображение.
Можно еще вот так сделать (фрагмент)
Код AS1/AS2:

p.x+= step;
p.y+= step;
 
//уберите эти комментарии при втором просмотре:
if (p.x > bmd.width - 30 || p.y > bmd.height - 30) step = -1;
if (p.x < 0 || p.y < 0) step = 1;

Шум будет плавать туда-сюда, но нормально смешиваясь без границ.

orcpochta 14.04.2010 19:56

Цитата:

Сообщение от Wolsh (Сообщение 900539)
В том то и дело, что связаны. Исправь условие на if (p.x >= bmd.width - 30) p.x = 0; и увидишь. Будет дергаться конечно, но границы битмапины не попадут в изображение.
Можно еще вот так сделать (фрагмент)
Код AS1/AS2:

p.x+= step;
p.y+= step;
 
//уберите эти комментарии при втором просмотре:
if (p.x > bmd.width - 30 || p.y > bmd.height - 30) step = -1;
if (p.x < 0 || p.y < 0) step = 1;

Шум будет плавать туда-сюда, но нормально смешиваясь без границ.

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

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

Tahion 14.04.2010 20:56

И вы правы мистер Wolsh :). А я долго не мог понять что там не 1 битмап :/

Код AS3:

var rows:uint = 3;
var columns:uint = 4;
 
var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE;
var p:Point = new Point( );
 
var bmd:BitmapData = new BitmapData(100, 100, false, 0x00000000);
 
var bmp:Bitmap;
var str:String = "bmp";
var bitmaps:Array = [];
 
for (var i:int = 0; i <  rows * columns; i++)
{       
        bmp = this[str + i] = new Bitmap(bmd.clone());
        bitmaps.push(bmp);
        addChild(bmp);
 
        bmp.y = bmd.height * int(i / columns);
        bmp.x = bmd.width * int(i % columns);
}
 
addEventListener(Event.ENTER_FRAME, enterFrameListener);
 
function enterFrameListener(e:Event = null):void
{       
        p.x++;
        p.y++;
 
        for (var i:int = 0; i <  rows * columns; i++)
        {       
                var _bmp:Bitmap = bitmaps[i];
 
                var bmp:BitmapData = _bmp.bitmapData;
                var p2:Point = p.clone();
                p2.x += _bmp.x;
                p2.y += _bmp.y;
                bmp.perlinNoise(30, 30, 1, 0, true, true, channels, false, [p2]);
        }
 
}

Вообще эта операция perlinNoise очевидно слишком трудоемка для флеша чтобы в ентерфрейме генерировать его. Однократно сгенерировать перлин для придиния определенных эфектов текстуры это еще куда не шло. Но это :)... Хотя красиво

Кстати странно что если сделать 1 большой битмап и применять кнему шум то это будет гораздо менее производительно если к нескольким маленьким, даже не сомтря на то что там много лишних действей в цикле

orcpochta 14.04.2010 21:04

Tahion, извините, вы специально придуриваетесь или это вышло ненароком?

в смысле зачем вы перлите rows * columns раз, когда весь смысл поста был перлить один раз и результат использовать везде, т.к. он должен был быть безшовным.

Tahion 14.04.2010 22:02

Тут был пост волша который все объяснял но он почемуто пропал. Ваш вариант ошибочный т.к не учитывается смещение x и y у каждого битмапа, каждый битмап отрисовывает копию даты и естественно что например нижний край верхнего битмапа не будет соответсвовать верхнему краю битмапа ниже его, он будте соответствовать верхнему краю битмапа ниже. Пост волша был более красноречив но так как он пропал это не существенно

orcpochta 14.04.2010 22:22

Цитата:

Ваш вариант ошибочный т.к не учитывается смещение x и y у каждого битмапа, каждый битмап отрисовывает копию даты
битмэп - это всего лишь контейнер для битмэпдаты, какое уж тут смещение надо учитывать не понятно совершенно, т.к. во всех битмапах используется одна битмэпдата, которая загружается в контейнер без каких-либо смещений

Цитата:

Сообщение от Tahion (Сообщение 900577)
не будет соответсвовать верхнему краю битмапа ниже его, он будте соответствовать верхнему краю битмапа ниже.

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

в своем первом посте в этой темы я исходил из того, что

Цитата:

stitch (Boolean): при значении true этот метод будет стараться сгладить края перехода изображения для создания ровных текстур, которые можно использовать для мозаичной заливки растровым изображением.
т.е. на основании этого изречения из справки предполагалось, что верхний край одного и того же среза шума Перлина будет безшовно стыковаться с нижним краем этого среза
в сущности так оно и происходит, пока сдвиг не приближается к краям битмэпдаты

Wolsh, верните свой пост, который все объяснял!)))

Wolsh 14.04.2010 22:32

Он был упадочный и я его убил))))
Короче вот что.
Прямоугольник 30х30 опускается вниз и вправо. Когда он доходит до крайней точки СВОЕЙ точкой 0:0, то в самом прямоугольнике уже ничего нет, это и видится как резкие края. Поэтому я возвращаю его, когда он доходит своей нижней точкой до нижней точки битмапа. Но прикольный адобовский нойз генерится с шагом, равным размеру битмапины, и чтобы шаг рисунка шума совпал, надо доехать до конца))))) Вот такой бред. Я не вижу выхода, потому и удалил, что сказать толком нечего.

orcpochta 14.04.2010 22:42

Цитата:

Сообщение от Wolsh (Сообщение 900581)
Он был упадочный и я его убил))))
Короче вот что.
Прямоугольник 30х30 опускается вниз и вправо. Когда он доходит до крайней точки СВОЕЙ точкой 0:0, то в самом прямоугольнике уже ничего нет, это и видится как резкие края. Поэтому я возвращаю его, когда он доходит своей нижней точкой до нижней точки битмапа. Но прикольный адобовский нойз генерится с шагом, равным размеру битмапины, и чтобы шаг рисунка шума совпал, надо доехать до конца))))) Вот такой бред. Я не вижу выхода, потому и удалил, что сказать толком нечего.

ну да, это все мне еще вчера стало понятно, но даже когда в прямоугольнике уже ничего нет и он едет дальше, все равно что-то продолжает генерироваться, но уже нет бесшовной спайки - короче, реально бред какой-то)))

UPD: а еще не совсем понятна мысль из справки: http://help.adobe.com/ru_RU/AS3LCR/F...ay/Bitmap.html

Цитата:

Объект BitmapData можно вызвать на экран объектом Bitmap одним из двух способов: с помощью векторного средства визуализации, такого как фигура, заполненная растровым изображением, или с использованием более быстрой подпрограммы копирования пикселов. Подпрограмма копирования пикселов работает намного быстрее, чем векторное средство визуализации, но объект Bitmap должен соответствовать определенным условиям для его использования.
что это значит? не совсем понял, что это за способы.

а далее в описании свойства pixelSnapping идет:
Цитата:

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

мозг уже вскипел с этими битмапами и справками(((

Добавлено через 3 часа 51 минуту
Всем дарю!)))

Код AS3:

var rows:uint = 3;
var columns:uint = 4;
 
var channels:uint = 12;
var p:Point = new Point( );
var p2:Point = new Point( );
 
var bmd:BitmapData = new BitmapData(100, 100, true, 0xFFFFFFFF);
 
var bmp:Bitmap;
var str:String = "bmp";
 
for (var i:int = 0; i <  rows * columns; i++)
{       
        bmp = this[str + i] = new Bitmap(bmd);
        addChild(bmp);
 
        bmp.y = bmd.height * int(i / columns);
        bmp.x = bmd.width * int(i % columns);
}
 
var r:int = (100 - 40) / 2;
var p0:Point = new Point(r, r);
var angle:Number = 0;
 
addEventListener(Event.ENTER_FRAME, enterFrameListener);
function enterFrameListener (e:Event):void
{       
        angle += .01;
 
        p.x = p0.x + r * Math.cos(angle);
        p.y = p0.y + r * Math.sin(angle);
 
        p2.x = p0.x - r * Math.cos(angle);
        p2.y = p0.y - r * Math.sin(angle);
 
        bmd.perlinNoise(40, 40, 2, 0, true, false, channels, false, [p, p2]);
}

красиво без магических цифр не оформлял, но идея в том, чтобы прямоугольник из последнего перед этим поста Wolsh-a ходил не по прямой или туда-сюда, а по кругу или эллипсу (если линейные размеры битмапдаты разные по горизонтали и вертикали), или любой гладкой кривой, но так чтобы не выезжал за пределы битмапдаты - т.е. это может быть даже случайный алгоритм, лишь бы гладкий путь был, ограниченный так, чтобы прямоугольник всегда был в рамке битмапдаты...)))

orcpochta 21.04.2010 17:39

практическое применение, если кому интересно:
http://www.polkanov.com/labyrinth/


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

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