Архив

Архив раздела ‘Основы’

Туториалы по Alternativa 3D на сайте The Tech Labs

10 марта 2009 Нет комментариев

На сайте The Tech Labs появились очень хорошие по качеству туториалы по работе с Alternativa 3D:

null

Использование Matrix3D для z-сортировки

8 октября 2008 2 комментария

Как всегда буду краток. Для сортировки можно использовать следующий механизм:

public var faces:Array; . . .

public function ReorderChildren()
{
    for(var i:uint = 0; i < 6; i++)
    {
        faces[i].z = faces[i].child.transform.getRelativeMatrix3D(root).position.z;
        this.removeChild(faces[i].child);
    }
    faces.sortOn("z", Array.NUMERIC | Array.DESCENDING);
    for (i = 0; i < 6; i++)
    {
        this.addChild(faces[i].child);
    }
}

Для ознакомления с другими возможностями Flash Player 10 читайте Help

Как повысить производительность AS3 приложений?

20 марта 2008 1 комментарий

Андрей Горбатов написал отличную статью, помогающую повысить производительность вашего ActionScript 3 приложения.

Честно говоря, для меня было откровением, что, например, при вычислении абсолютного значения конструкция

i = x < 0 ? -x : x;

работает на 250% быстрее чем

i = Math.abs(x);

Короче говоря, настоятельно рекомендую читать всем!

Categories: Основы Tags:

Визуализация 3D поверхностей во Flex

17 марта 2008 1 комментарий

Я решил еще немного поработать с предыдущим примером и сделал простенькое Flex приложение. Исходники прилагаются.

Оперирование визуализацией произвольных 3D поверхностей

14 марта 2008 2 комментария

В продолжение предыдущей публикации, я попробовал расширить наглядность примера. Для этого я создал новый 3D-объект, который представляет собой набор из 11 параметрических поверхностей (взято из туториала "A Demonstration of Customizable Features of Our 3D Surfaces") :

Класс Surfaces:

package lib3d {
	import lib3d.Object3D;

	/**
	 * @author Michael
	 */
	public class Surfaces extends Object3D {
		private var _exampleNum : int = 1;

		public function set exampleNum(n : Number) : void {
			_exampleNum = n;
			setTilesArray();
		}

		public function get exampleNum() : Number {
			return _exampleNum ;
		}

		private const cubeSize : Number = 100;

		public function Surfaces() {
			super();
		}

		override public function setTilesArray() : void {
			var i : int;
			var j : int;
			var istep : Number;
			var jstep : Number;
			var tmin : Number;
			var tmax : Number;
			var smin : Number;
			var smax : Number;
			var curt : Number;
			var curs : Number;

			tmin = 0;
			smin = 0;

			switch (_exampleNum) {
				case 1:
					tmax = Math.PI;
					smax = 7 / 4 * Math.PI;
					break;
				case 2:
					tmax = 2 * Math.PI;
					smax = 2 * Math.PI;
					break;
				case 3:
					tmax = 1.5 * Math.PI;
					smax = 2 * Math.PI;
					break;

				case 4:
					tmax = Math.PI;
					smax = 1.5 * Math.PI;
					break;

				case 5:
					tmax = Math.PI;
					smax = 2 * Math.PI;
					break;

				case 6:
					tmax = Math.PI;
					smax = 1.5 * Math.PI;
					break;

				case 7:
					tmax = 1;
					smax = 2 * Math.PI;
					break;

				case 8:
					tmax = 1.5 * Math.PI;
					smax = 2 * Math.PI;
					break;

				case 9:
					tmax = 1.5 * Math.PI;
					smax = 2 * Math.PI;
					break;

				case 10:
					tmax = Math.PI;
					smax = 2 * Math.PI;
					break;

				case 11:
					tmax = Math.PI;
					smax = 3 * Math.PI;
					break;
			}
			istep = (smax - smin) / nMesh;
			jstep = (tmax - tmin) / nMesh;
			tilesArray = new Array();
			for(i = 0;i <= nMesh; i++) {
				curs = istep * i + smin;
				tilesArray[i] = new Array();
				for(j = 0;j <= nMesh;j++) {
					curt = jstep * j + tmin;
					switch (_exampleNum) {
						case 1:
							tilesArray[i][j] = [cubeSize * Math.cos(curs) * Math.sin(curt),cubeSize * Math.sin(curs) * Math.sin(curt),cubeSize * Math.cos(curt)];
							break;
						case 2:
							tilesArray[i][j] = [cubeSize / 4.4 * (curt) * Math.cos(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 4.4 * (curt) * Math.sin(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 3.7 * (curt) * Math.cos(Math.cos(curt)) - 0.8 * cubeSize];
							break;
						case 3:
							tilesArray[i][j] = [cubeSize / 4.3 * Math.cos(curs) * (2 + Math.cos(curt) * 2),cubeSize / 4.3 * Math.sin(curs) * (2 + Math.cos(curt) * 2),cubeSize / 2.6 * (3 - curt) - 0.3 * cubeSize];
							break;

						case 4:
							tilesArray[i][j] = [cubeSize / 1.6 * Math.sqrt(curt) * Math.sin(2 * curt) * Math.cos(curs - Math.PI),cubeSize / 1.6 * Math.sqrt(curt) * Math.sin(2 * curt) * Math.sin(curs - Math.PI),cubeSize / 1.6 * Math.sqrt(curt) * Math.cos(2 * curt) - 0.15 * cubeSize];
							break;

						case 5:
							tilesArray[i][j] = [cubeSize / 3.5 * Math.cos(curs) * (Math.cos(4 * curt) + 2),cubeSize / 3.5 * Math.sin(curs) * (Math.cos(4 * curt) + 2),cubeSize / 2 * curt - 0.8 * cubeSize];
							break;

						case 6:
							tilesArray[i][j] = [3.2 * cubeSize * Math.sin(curt) * Math.cos(Math.PI / 2 * Math.sin(curt) * Math.cos(curs)) / 2 * Math.sin(curt) * Math.cos(curs),2.2 * cubeSize * Math.sin(curt) * Math.cos(Math.PI / 2 * Math.sin(curt) * Math.cos(curs)) / 2 * Math.sin(curt) * Math.sin(curs),2.2 * cubeSize * Math.sin(curt) * Math.cos(Math.PI / 2 * Math.sin(curt) * Math.cos(curs)) / 2 * Math.cos(curt)];
							break;

						case 7:
							tilesArray[i][j] = [cubeSize / 2.4 * (2 * Math.cos(curs) + (curt - 0.5) * Math.cos(curs / 2)),cubeSize / 2.4 * (2 * Math.sin(curs) + (curt - 0.5) * Math.cos(curs / 2)),cubeSize / 2.4 * 4 * (curt - 0.5) * Math.sin(curs / 2) - 0.1 * cubeSize];
							break;

						case 8:
							tilesArray[i][j] = [cubeSize / 4.3 * (curt) * Math.cos(curs + Math.PI) * Math.sin(curt),cubeSize / 4.3 * (curt) * Math.sin(curs + Math.PI) * Math.sin(curt),cubeSize / 4.3 * (curt) * Math.cos(curt)];
							break;

						case 9:
							tilesArray[i][j] = [cubeSize / 2.8 * (curt) * Math.cos(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 2.8 * (curt) * Math.sin(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 2.8 * (curt) * Math.cos(Math.cos(curt)) - cubeSize];
							break;

						case 10:
							tilesArray[i][j] = [cubeSize / 1.15 * Math.cos(curs) * Math.sin(2 * curt),cubeSize / 1.15 * Math.sin(curs) * Math.sin(2 * curt),cubeSize / 1.15 * Math.cos(curt)];
							break;

						case 11:
							tilesArray[i][j] = [cubeSize / 2.7 * Math.pow(4 / 3, curs - 5) * Math.sin(curt) * Math.sin(curt) * Math.cos(curs - 5),cubeSize / 2.7 * Math.pow(4 / 3, curs - 5) * Math.sin(curt) * Math.sin(curt) * Math.sin(curs - 5) + 0.2 * cubeSize,cubeSize / 2.7 * Math.pow(4 / 3, curs - 5) * Math.sin(curt) * Math.cos(curt) - 0.2 * cubeSize];
							break;
					}
				}
			}
		}
	}
}

Небольшие изменения для управления альфа-каналом пришлось сделать в классе View3D. Попробуйте сами его "доработать лобзиком" 🙂 Ну а нетерпеливые могут скачать архив.

Пример простой 3D визуализации

11 марта 2008 1 комментарий

Прочитав туториал "Simple 3D Drawing in Flash CS3", я решил разобраться в исходниках и немного их "классифицировать" (для большей универсальности). И у меня получились следующие классы:

  • Object3D - прототип 3D объекта;
  • Sphere - параметрически описанный объект сферы
  • View3D - класс, рисующий 3D объект
  • Main - основной класс документа

Смотреть результат.

Читать далее...

Загрузка и воспроизведение видео с использованием ActionScript 3.0

4 марта 2008 4 комментария

Вспомним, что нам нужно было для того, чтобы воспроизвести FLV файл с помощью Flash. В ActionScript 2.0 нужно было выполнить следующую последовательность действий:

1. Создать новый объект Video в вашей библиотеке (выбрать New Video в меню опций библиотеки);
2. Перетащить объект Video на сцену и дать имя экземпляру;
3. Добавить в первый кадр код.

Читать далее...

Знакомство с основами AMF

30 ноября 2007 7 комментариев

Тед Патрик знакомит с основами формата AMF. Формат AMF - это бинарный формат, представляющий собой сериализованный ActionScript объект. Этот тип данных широко используется Flash-плеером и AIR как для хранения данных, так и для обмена ими. Во Flash Player 9 и AIR для работы с AMF в первую очередь используется класс flash.utils.ByteArray. Например:


//Создадим AMF используя ByteArray


import flash.utils.ByteArray;

//Создание байтовой последовательности
var bytes:ByteArray = new ByteArray();

//Запись объекта в виде байтовой последовательности
bytes.writeObject({myString:"Hello World", myNumber:21, myBool:true});

В то время как Вы записываете объект в ByteArray, он сериализуется в байтовую последовательность, используемую форматом AMF. Теперь можно эту последовательность передать посредством сети или сохранить в файловой системе для последующего использования путем десериализации. Простейший пример десериализации AMF:


//Создаем объект и десериализуем из байтовой последовательности
var myObject:Object = bytes.readObject();

//Проверяем результат
trace( myObject.myString ) // Hello World

Во Flash Player-е AMF используется в таких классах, как SharedObject, RemoteObject, LocalConnection, ByteArray, RTMP (во всех вариантах) и во всех удаленных RPC-операциях. Выгодность использования AMF на данный момент сильно недооценена, несмотря на то что имеет ряд преимуществ:

  • Размер файла - Объекты AMF имеют очень маленький объем за счет того что сжаты с использованием zlib.
  • Быстрая Сериализация/Десериализация - Скорость кодирования/раскодирования в AMF очень высока даже при малом количестве памяти и медленном процессоре.
  • Поддержка как стандартных типов данных, так и кастомных классов - Вы можете сериализировать любой объект (кроме displayObjects, конечно).

И еще... Тед обещает нам большую новость об AMF в декабре... будем ждать.

Внедрение внешних ресурсов в конечный SWF

28 октября 2007 Нет комментариев

Прочитав статью "Font Embedding in AS3" Майка Джонсона (Mike Johnson) я решил рассказать о том, как создавать и использовать аналоги элементов библиотеки без использования Flash IDE... но обнаружил, что Алексей «Vooparker» Аникутин уже "намусорил" в одном из авторитетнейших для меня блоге - Garbage Collector.

Итак, всем читать статью "Включение файлов в SWF в виде байтовой последовательности".

Свет, камера, ActionScript 3.0!

8 октября 2007 9 комментариев

Проанализировав свои предыдущие публикации я понял, что как то не с того начал. Может быть стоило рассказать о языке с самого начала? Но, лучше поздно, чем... очень поздно 🙂

В целях знакомства приведу выдержки из публикации Аниты Рамасвами

Что же такое ActionScript?

ActionScript 3.0 - это объектно-ориентированный язык программирования, обладающий большими возможностями и знаменующий собой важный шаг в эволюции Flash Player Runtime.

История

ActionScript - это язык программирования, основанный на ECMAScript и используемый для написания сценариев кинофрагментов и приложений на Adobe Flash. Впервые ActionScript 1.0 (его полностью программируемая версия) появился в составе Flash 5. Во Flash 6 было добавлено несколько встроенных функций, а также появилась возможность осуществлять более эффективное программное управление анимированными элементами. Во Flash 7 был введен ActionScript 2.0, который был строго типизирован и предоставлял возможности программирования, связанные с использованием классов, такие как наследование, интерфейсы и строгая типизация данных. Читать далее...