Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Создание отражения (сложение alpha каналов по умножению) (http://www.flasher.ru/forum/showthread.php?t=99556)

Ляксей 08.08.2007 14:18

Создание отражения (сложение alpha каналов по умножению)
 
Хочу сделать эффект отражения картинки ( с альфа каналом)

Результат выглядит примерно вот так
[IMG]http://img502.**************/img502/2821/reflectionoq8.th.jpg[/IMG]
То есть отражением является перевёрнутая обрезанная картинка плавно исчезающая к низу.

У меня получилось реализовать только попиксельно, что довольно сильно тормозит при бальших отражениях.
Вопрос как сделать это более аппаратно ?

Вод код функции
Код:

// создать отражение
        function CreateReflection()
        {
                // создаём Bitmap для будущего отражения
                var myBitmapData:BitmapData = new BitmapData(m_picture._width, GLB_data.m_reflection_height);       
                myBitmapData.fillRect(new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),0x00000000);

                // переворачиваем отражение
                var matrix:Matrix = new Matrix();               
                matrix.scale(1,-1);
                matrix.translate(0,m_picture._height);
               
                // записываем в myBitmapData отражение
                myBitmapData.draw(m_picture,matrix);
               
                // теперь хотим сделать так, чтобы отражение исчезало по градиенту сверху вниз
                // то есть по сути хотим умножить альфа канал отражения на затухающий градиент
               
                //Alpha_Gradient_mc - это клип с градиентом от непрозрачного к прозрачному
                var grad_clip = attachMovie("Alpha_Gradient_mc","grad",getNextHighestDepth());               
                var grad_matrix = new Matrix();
               
                // подстраиваем градиент под правильный размер отражения
                grad_matrix.scale(m_picture._width/grad_clip._width,GLB_data.m_reflection_height/grad_clip._height);                               
                var grad_bitmap:BitmapData = new BitmapData(m_picture._width, GLB_data.m_reflection_height);       
                grad_bitmap.fillRect(new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),0x00000000);               
                grad_bitmap.draw(grad_clip,grad_matrix);
               

               
                var color_transform:ColorTransform = new ColorTransform();               
                grad_matrix = new Matrix();       
               

                // эти закоментареные строки правильного результата не дали               
                //myBitmapData.draw(grad_bitmap,grad_matrix,color_transform,"multiply");                               
                //myBitmapData.copyChannel(grad_bitmap, new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height), new Point(0, 0), 1, 8)
                //myBitmapData.merge(grad_bitmap, new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),new Point(0, 0), 128, 0, 0, -255);
               
                // попиксельная обработка хоть и даёт правильный результат, то уж больно тормозит
                for(var i_x = 0;i_x<m_picture._width;i_x++)
                {
                        for(var i_y = 0;i_y<GLB_data.m_reflection_height;i_y++)
                        {                               
                                var pict_color = myBitmapData.getPixel32(i_x,i_y);
                                var grad_color = grad_bitmap.getPixel32(i_x,i_y);
                               
                                var alpha  = (((pict_color>> 24 & 0xFF)) * ((grad_color>> 24) & 0xFF))/255;
                                //var alpha  = ((grad_color>> 24) & 0xFF);
                                pict_color = pict_color & 0x00FFFFFF;
                               
                                trace(alpha);                               
                                alpha = alpha << 24;
                                pict_color += alpha;
                                myBitmapData.setPixel32(i_x,i_y,pict_color);                               
                        }
                }
               
                grad_clip.removeMovieClip();               
                m_reflection.attachBitmap(myBitmapData, m_reflection.getNextHighestDepth(), "auto", true);               
        }


screamge 08.08.2007 14:31

Можно зделать при помощи маски, _rotate и _alpha :)

Kikasso 08.08.2007 14:42

прикольно на этом imageshark - зашел, я 10000-й посетитель и что-то выиграл, обновляю страницу - я уже 999999-й ))
Только не _rotation, а _уscale - это ж зеркало

screamge 08.08.2007 14:46

Цитата:

Сообщение от Kikasso
Только не _rotation, а _уscale - это ж зеркало

Значение в минус? Так тоже можно.

etc 08.08.2007 14:47

http://silin.fatal.ru/#2,3

KPOT 08.08.2007 17:54

а еще таких картинок у вас нету?

Ляксей 08.08.2007 19:41

Цитата:

Сообщение от __etc

Это к сожалению не подходит, так как там альфа канал просто заливается градиентом.
Код:

maskMC.beginGradientFill("linear",
                                [0,0],
                                [0,int(alpha*0xFF)],
                                [0,0xFF],
                                {matrixType:"box", x:0, y:0, w:width, h:height, r:Math.PI/2});

И это будет выглядеть вот так
[IMG]http://img64.**************/img64/7666/reflection1aq5.th.jpg[/IMG]


Цитата:

Сообщение от KPOT
а еще таких картинок у вас нету?

Есть. Очень нужная вещь для тестирования

А вот с масками надо попробовать

etc 08.08.2007 20:22

А в чем разница-то? Настройте градиент и проблем никаких.

Ляксей 09.08.2007 17:16

Цитата:

Сообщение от __etc
А в чем разница-то? Настройте градиент и проблем никаких.

Обратите внимание на отражение самой левой девочки - всё что было прозрачным ( вокруг неё) залилось непрозрачным. Получился вокруг чёрный фон.
Если Вы прочитаете название топика, то увидите, что нужно сложить два альфа канала по умножению, а не настраивать градиент. В первом посте приведён метод попиксельной обработки.

etc 09.08.2007 17:25

Хм. Черный фон — это проблема реализации.
http://etcs.ru/pre/Core/picture.swf (нажать пробел после загрузки), такое нужно отражение? Прозрачная картинка или нет — неважно.


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

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