вторник, 22 апреля 2008 г.

Эффекты с материалами.

Очередной этап состоит в изменении свойств материалов, из которых состоят примитивы, используя известные эффекты, такие как размытие, сияние и прочие. Для рассмотрения примеров будем пользоваться немножко измененным примером с плоскостью, залитую однородным красным цветом.
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.utils.Timer;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.*;
import org.papervision3d.materials.*;
import org.papervision3d.scenes.MovieScene3D;

[SWF(width='400',height='400',backgroundColor='0x000000',frameRate='30')]

public class ExampleTransformationRotate extends Sprite
{
private var container: Sprite;
private var scene: MovieScene3D;
private var camera: Camera3D;
private var plane:Plane;
private var myTimer:Timer = new Timer(100);

public function ExampleTransformationRotate()
{
container = new Sprite;
container.x = 200;
container.y = 200;
addChild( container );
scene = new MovieScene3D( container );
camera = new Camera3D();
camera.z = -500;
camera.zoom = 5;

var material:ColorMaterial = new ColorMaterial();
material.doubleSided = true;
material.fillColor = 0xFF0000;
material.smooth = true;
plane = new Plane( material, 300, 300, 1, 1 );
scene.addChild( plane );
myTimer.start();
myTimer.addEventListener(TimerEvent.TIMER, timerHandler);

}

private function timerHandler( ev:TimerEvent ): void
{
plane.rotationX += 5;
plane.rotationY += 2;
plane.rotationZ += 7;
scene.renderCamera( camera );

}
}
}

Этот пример немного отличается от использованного ранее. Здесь вращение плоскости осуществляется не на событие enterFrame, а по тику таймера.


  • Эффект изменения прозрачности.
    Для реализации нам понадобится изменить одно свойство материала, а именно fillAlpha. Если после подчеркнутой строки добавить material.fillAlpha = 0.1; , то вместо вращающегося ярко-красного квадратика перед нами окажется тусклый квадратик. Зачение свойства fillAlpha позволяет регулировать прозрачность заливки. Значение 0 соответствует полной прозрачности, а значение 1 - полной непрозрачности.
    Для WireframeMaterial (провоочного каркаса) эффекта можно добиться при помощи изменения пары свойств материала: material.lineColor = 0xFF0000; - отвечает за цвет каркасных линий, material.lineAlpha = 0.1; - задает их прозрачность.
    Для BitmapFileMaterial и для MovieAssetMaterial (он тоже на основе BitmapData вроде как) я пока не пойму, возможно ли изменение прозрачности заливки.
  • Эффекты с фильтрами.
    Поскольку никто не отменял использование фильтров, посмотрим, как это может улучшить результат. Для реализации, во-первых, необходимо сделать импорт соответствующей библиотеки: import flash.filters.*;. Во-вторых, в любом месте после вызова конструктора переменной container нужно сформировать набор фильтров. Например, рассмотрим эффекты сияния:

    var filter:Array = new Array();
    filter.push(new GlowFilter(0x00FF00, 0.5, 20,20, 2, BitmapFilterQuality.HIGH, false, false));
    filter.push(new GlowFilter(0x00FF00, 1, 40, 40, 2, BitmapFilterQuality.HIGH, true, false));

    Я не объясняю принцип формирования массива фильтров, считаю, что это хорошо известно и понятно написано в хелпе для Flash. После того, как массив фильтров заполнен, можно его применять: container.filters = filter;. Отличный красный квадратик с зеленым сиянием - это то, что должно было получиться. Замечу, что фильтры применяются именно к контейнеру. Такой подход работает и для WireframeMaterial, и для битмапов.

Комментариев нет: