Архив

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

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

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

null

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

8 Октябрь 2008 2 comments

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

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 comments

В продолжение предыдущей публикации, я попробовал расширить наглядность примера. Для этого я создал новый 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 1 комментарий

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

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

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

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

30 Ноябрь 2007 3 comments

Тед Патрик знакомит с основами формата 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 comments

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

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

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

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

История

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