![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Nov 2006
Сообщений: 93
|
Хочу сделать эффект отражения картинки ( с альфа каналом)
Результат выглядит примерно вот так [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);
}
|
|
|||||
|
Ветеран форума
Регистрация: Jul 2006
Адрес: Грузия, Тбилиси
Сообщений: 2,675
|
Можно зделать при помощи маски, _rotate и _alpha
![]() |
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
прикольно на этом imageshark - зашел, я 10000-й посетитель и что-то выиграл, обновляю страницу - я уже 999999-й ))
Только не _rotation, а _уscale - это ж зеркало |
|
|||||
|
Ветеран форума
Регистрация: Jul 2006
Адрес: Грузия, Тбилиси
Сообщений: 2,675
|
Цитата:
Последний раз редактировалось screamge; 08.08.2007 в 14:52. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
|
|
|||||
|
[+1.3 31.07.07]
Регистрация: Jul 2007
Сообщений: 64
|
а еще таких картинок у вас нету?
|
|
|||||
|
Регистрация: Nov 2006
Сообщений: 93
|
Цитата:
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] Цитата:
А вот с масками надо попробовать |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
А в чем разница-то? Настройте градиент и проблем никаких.
|
|
|||||
|
Регистрация: Nov 2006
Сообщений: 93
|
Цитата:
Если Вы прочитаете название топика, то увидите, что нужно сложить два альфа канала по умножению, а не настраивать градиент. В первом посте приведён метод попиксельной обработки. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Хм. Черный фон — это проблема реализации.
http://etcs.ru/pre/Core/picture.swf (нажать пробел после загрузки), такое нужно отражение? Прозрачная картинка или нет — неважно. Последний раз редактировалось etc; 09.08.2007 в 17:27. |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:05. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|