Вообще, я тоже нуб, но в Away давно копаюсь, поэтому набросал вам небольшой код:
Главный класс:

Код AS3:
package
{
import away3d.cameras.Camera3D;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.entities.Mesh;
import away3d.materials.ColorMaterial;
import away3d.materials.TextureMaterial;
import away3d.primitives.CubeGeometry;
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author FlasherEgor
*/
public class Test1 extends Sprite
{
private var scene:Scene3D;
private var camera:Camera3D;
private var view:View3D;
//Хранить квадратики.
private var squares:Vector.<Square> = new Vector.<Square>();
public function Test1()
{
//Сначала все создаем.
scene = new Scene3D();
camera = new Camera3D();
view = new View3D(scene, camera);
addChild(view);
//Создаем квадратики. Можно их в какой-то "2мерной матрице" хранить, но я выбрал вектор, чтобы не заморачиваться.
for (var ix:int = 0; ix <= 10; ix++)
for (var iy:int = 0; iy <= 10; iy++)
{
var sq:Square = new Square();
//Двигаем его по сцене.
sq.x = (ix - 5) * 55;
sq.z = (iy - 5) * 55;
//Сообщаем, какая у него позиция.
sq.numberOfPosition.x = ix;
sq.numberOfPosition.y = ix;
//Добавляем на сцену и в вектор.
scene.addChild(sq);
squares.push(sq);
}
//Чуть-чуть отодвигаем камеру, чтобы все видеть.
camera.y = 500;
camera.z = -500;
camera.rotationX = 45;
addEventListener(Event.ENTER_FRAME, enterFrameHandler);//Понятно, для чего
}
public function enterFrameHandler(e:Event):void
{
for each(var square:Square in squares) square.dispatchEvent(e);//Повторяем события ENTER_FRAME для каждого квадратика. Я просто не знаю, как иначе проиграть анимацию.
view.render();//Рендерим
}
}
}
Квадратик:

Код AS3:
package
{
import away3d.containers.ObjectContainer3D;
import away3d.core.base.Geometry;
import away3d.entities.Mesh;
import away3d.events.MouseEvent3D;
import away3d.events.Object3DEvent;
import away3d.materials.ColorMaterial;
import away3d.materials.MaterialBase;
import away3d.primitives.PlaneGeometry;
import flash.events.Event;
import flash.geom.Point;
/**
* ...
* @author FlasherEgor
*/
public class Square extends ObjectContainer3D
{
private var _faceMesh:Mesh; //"красная" сторона, но она он может быть любой. Это что спереди.
private var _backMesh:Mesh; //"синяя" сторона, но она может быть любой. Это что сзади. Например, картинка, которая там должна быть.
private var _commonGeometry:Geometry; //По сути, они оба одинаковые, пусть у них будет одинаковая геометрия.
private var _rotationLimit:int = 0; //Для анимации. Сколько кадров до переворота.
private var _rotationSpeed:int = 5; //Для анимации. На сколько градусов мы поворачиваем плоскость за кадр.
private var _nextStateIsRed:Boolean = true; //После анимации квадратик станет красным?
public var numberOfPosition:Point = new Point(0, 0); //Хранить, в какой условной клетке квадратик находится.
public function Square()
{
super();//Здесь понятно
_commonGeometry = new PlaneGeometry(50, 50);//Создаем геометрию для обоих сторон
_faceMesh = new Mesh(_commonGeometry, new ColorMaterial(0xF00000));//Создаем верхнюю сторону. Материал может быть любой. Условно здесь - красный цвет.
_backMesh = new Mesh(_commonGeometry, new ColorMaterial(0x0000F0));//Создаем нижнюю сторону. Материал может быть любой. Условно здесь - синий цвет.
_backMesh.rotationZ = 180;//Заднюю сторону поворачиваем на 180 градусов.
//Разрешаем диспатчить события мыши
_faceMesh.mouseEnabled = true;
_backMesh.mouseEnabled = true;
//Квадратик, наследуясь от ObjectContainer3D, добавляет стороны в себя
addChildren(_faceMesh, _backMesh);
//Ждем, когда пользователь нажмет клавишу мыши.
addEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);
}
public function mouseDownHandler(e:MouseEvent3D):void
{
//Теперь ждем, когда пользователь прекратит нажимать. Аналог MouseEvent.CLICK получается.
addEventListener(MouseEvent3D.MOUSE_UP, mouseUpHandler);
}
public function mouseUpHandler(e:MouseEvent3D):void
{
removeEventListener(MouseEvent3D.MOUSE_UP, mouseUpHandler);//Перестаем ждать, когда пользователь отпустит мышь
removeEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);//Кроме того, запрещаем нажимать еще раз, пока анимация не кончится
addEventListener(Event.ENTER_FRAME, enterFrameHandler);//Запускаем событие обновления кадра для анимации - ну, я просто не знаю, как иначе это сделать.
_rotationLimit = 180 / _rotationSpeed;//Настраиваем анимацию.
_nextStateIsRed = !_nextStateIsRed;//Если сейчас должен был быть красный, то потом будет синий.
}
public function enterFrameHandler(e:Event):void
{
rotationZ += _rotationSpeed;//Поворачиваем по Z наш квадратик
_rotationLimit --;//-1 кадр должен прокрутиться
if (_rotationLimit <= 0)//если анимация кончилась то
{
rotationZ = (_nextStateIsRed)?0:180;//Корректируем поворот. Если трейсить, там погрешность в какие-то сверхмаленькие доли, но нужно, чтобы было четко.
removeEventListener(Event.ENTER_FRAME, enterFrameHandler);//Прекращаем анимацию
addEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);//Разрешаем пользователю поворачивать квадратик еще раз
//Здесь можно, например, диспатчить какое-то событие.
//Или вызывать какой-нибудь метод. Трейс для примера.
trace(numberOfPosition.x, numberOfPosition.y, ' - теперь я' , (_nextStateIsRed)?'красный.':'синий.');
}
}
}
}
Не знаю, насколько качественный алгоритм, но работает.
А если надо, вы, как опытный флэшер, легко переделаете на свой.