Minko is a tool that enables the creation of rich and interactive 3D web applications. Relying on the Adobe Flash Platform, Minko delivers high quality and interactive 3D graphics in any website. The engine has a modular architecture, allowing the developer to plug extensions to add new capabilities.

Below is a complete list of Minko features:

Scene Graph API

  • Extensible Scene Graph API
  • Scene nodes with mutliple parents
  • Flash-like interfaces (addChild, removeChild…)
  • Extensible camera system
  • Iterators
    • Per-triangles read/write data access
    • Per-vertex read/write data access
  • Animations API
    • Flash-like interfaces
    • Skinning (up to 55 bones with 8 influences)
    • Morphing
    • Paths
  • World-objects (lights, cameras…) pre-collection system
  • Operators overloading
  • Cascading dynamic rendering styles
  • Chainable method calls for:
    • 3D transforms
    • Scene manipulations
    • Cascading Rendering Style settings
  • Very low memory footprint
  • Dynamic textures (SWF, DisplayObject, Video…)
  • Automated and late textures allocation
  • Mesh/Streams API
    • Flexible Vertex Format system
    • Pre-defined and custom vertex formats
    • Automated and late data upload
    • Automated and late buffer allocation
    • Mesh modifiers system to override/overload geometry content

Rendering API

  • ActionScript 3.0 shaders
    • ActionScript 3.0 GPU programming
    • Automated shaders optimizations
      • Memoization
      • Optimized memory allocations
  • Multiple Render Target
  • Multi-pass rendering
  • Post-processing
  • Automated streams, textures and context setup
  • Scene-to-Rendering APIs bridge
  • Automated rendering reordering

Assets Loading API

  • Unified assets loading workflow
  • Extensible data parsers API
  • Synchronous and asynchronous loading
  • Automated textures loading

Sample

package
{
	import aerys.minko.render.Viewport;
	import aerys.minko.scene.node.camera.ArcBallCamera;
	import aerys.minko.scene.node.group.Group;
	import aerys.minko.type.math.Vector4;
	import aerys.monitor.Monitor;
	import aerys.qark.Qark;

	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.utils.ByteArray;

	import scene.Atmosphere;
	import scene.Earth;
	import scene.Globe;

	public class Main extends Sprite
	{
		private static const MOUSE_SENSITIVITY	: Number = .0006;
		private static const SPEED_SCALE	: Number = .9;
		private static const MAX_POINTS_PER_MESH: uint	 = 8000.;
		private static const MAX_ZOOM		: Number = 200.;
		private static const MIN_ZOOM		: Number = 320.;
		private static const COLORS		: Array	 = [0xd9d9d9, 0xb6b4b5, 0x9966cc, 0x15adff, 0x3e66a3,
								    0x216288, 0xff7e7e, 0xff1f13, 0xc0120b, 0x5a1301,
								    0xffcc02, 0xedb113, 0x9fce66, 0x0c9a39, 0xfe9872,
								    0x7f3f98, 0xf26522, 0x2bb673, 0xd7df23, 0xe6b23a,
													   0x7ed3f7];

		private var _viewport: Viewport	= new Viewport(2);
		private var _camera: ArcBallCamera = new ArcBallCamera();
		private var _globe: Globe = new Globe();
		private var _scene: Group = new Group(_camera, _globe, new Earth(), new Atmosphere());

		private var _cursor: Point = new Point();
		private var _speed: Vector4 = new Vector4()
		private var _initialized: Boolean = false;

		public function Main() {
			if (stage) initialize();
			else addEventListener(Event.ADDED_TO_STAGE, initialize);
		}

		private function initialize(event : Event = null) : void {
			removeEventListener(Event.ADDED_TO_STAGE, initialize);

			Monitor.monitor.watch(_viewport, ["numTriangles", "drawingTime", "renderingTime"]);
			addChild(Monitor.monitor);

			initializeScene();

			stage.frameRate = 30.;
			stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}

		private function initializeScene() : void {
			_viewport.defaultEffect = null;
			stage.addChild(_viewport);

			_camera.distance = MIN_ZOOM;
			_camera.farClipping = 11000;
		}

		private function enterFrameHandler(event : Event) : void
		{
			if (_initialized)
			{
				_camera.rotation.add(_speed);
				_camera.distance += _speed.z;
				_speed.scaleBy(SPEED_SCALE);

				if (_camera.distance < MAX_ZOOM) 					_camera.distance = MAX_ZOOM; 				else if (_camera.distance > MIN_ZOOM)
					_camera.distance = MIN_ZOOM;
			}

			_viewport.render(_scene);
		}
	}
}
3D . URL.