Кубик! Я ведь написал...

Код AS3:
package {
import flash.display.Sprite;
import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.Event;
import org.papervision3d.scenes.*;
import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.render.*;
import org.papervision3d.view.*;
import caurina.transitions.Tweener;
public class Cube extends Sprite {
// ----------------------------------------------------------------------------
// PUBLIC STATIC CONSTANTS
// ----------------------------------------------------------------------------
public static const VERSION:String = "1.0";
// ----------------------------------------------------------------------------
// CLASS PROPERTIES
// ----------------------------------------------------------------------------
private var _viewport:Viewport3D;
private var _renderer:BasicRenderEngine;
private var _scene:Scene3D;
private var _camera:Camera3D;
private var _cube:Cube;
private var _animationInProgress:Boolean = false;
// ----------------------------------------------------------------------------
// GETTERS AND SETTERS
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// CONSTRUCTOR
// ----------------------------------------------------------------------------
public function Cube() {
stage.addEventListener(KeyboardEvent.KEY_UP, globalKeyBoardListener);
stage.focus = stage;
build3D();
trace(_cube.rotationX, _cube.rotationY, _cube.rotationZ);
}
// ----------------------------------------------------------------------------
// PRIVATE METHODS
// ----------------------------------------------------------------------------
private function build3D():void {
_viewport = new Viewport3D(0, 0, true, true);
_viewport.buttonMode = true;
addChild(_viewport);
_renderer = new BasicRenderEngine();
_scene = new Scene3D();
var _materialList:MaterialsList = new MaterialsList();
_materialList.addMaterial(new ColorMaterial(0xFF0000, 1, true), "front");
_materialList.addMaterial(new ColorMaterial(0x0066CC, 1, true), "back");
_materialList.addMaterial(new ColorMaterial(0x006600, 1, true), "left");
_materialList.addMaterial(new ColorMaterial(0xFFCC00, 1, true), "right");
_materialList.addMaterial(new ColorMaterial(0x000000, 1, true), "top");
_materialList.addMaterial(new ColorMaterial(0x333333, 1, true), "bottom");
_cube = new Cube(_materialList, 300, 300, 300, 1, 1, 1);
_scene.addChild(_cube);
_camera = new Camera3D();
_camera.zoom = 110;
_camera.focus = 10;
_camera.x = 400;
_camera.y = 400;
_camera.lookAt(_cube);
this.addEventListener(Event.ENTER_FRAME, renderFrame);
}
private function animationComplete():void {
_animationInProgress = false;
_cube.rotationX %= 360;
_cube.rotationY %= 360;
_cube.rotationZ %= 360;
trace(_cube.rotationX, _cube.rotationY, _cube.rotationZ);
}
private function rotateCube(_rotationX:int, _rotationY:int):void {
if (!_animationInProgress) {
_animationInProgress = true;
var xRotation:int = _cube.rotationX + _rotationX;
var yRotation:int = _cube.rotationY + _rotationY;
Tweener.addTween(_cube, {rotationX:xRotation, rotationY:yRotation, time:0.3, transition:"linear", onComplete:animationComplete});
};
}
private function globalKeyBoardListener(event:KeyboardEvent):void {
switch (event.keyCode) {
case Keyboard.UP:
rotateCube(90, 0);
break;
case Keyboard.DOWN:
rotateCube(-90, 0);
break;
case Keyboard.LEFT:
rotateCube(0, 90);
break;
case Keyboard.RIGHT:
rotateCube(0, -90);
break;
default:
break;
}
}
private function renderFrame(event:Event):void {
_renderer.renderScene(_scene, _camera, _viewport);
}
// ----------------------------------------------------------------------------
// PUBLIC METHODS
// ----------------------------------------------------------------------------
}
}