имо в этой ситуации по-любому надо хранить 3D координаты частиц, тогда все логично и просто,
поиграйся с таким раскладом

Код AS3:
package
{
import flash.display.*;
import flash.events.*;
import flash.ui.*;
public class Main extends Sprite
{
private var _stars:Array = [];
private var _num:int = 200;
public function Main():void
{
for (var i:int = 0; i < _num; i++)
{
var star:Star = new Star();
_stars.push(star);
addChild(star);
}
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
private function onKeyDown(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT) rotate( -0.01);
if (event.keyCode == Keyboard.RIGHT) rotate( 0.01);
}
private function rotate(angle:Number):void
{
for (var i:int = 0; i < _num; i++) (_stars[i] as Star).rotate(angle);
}
}
}

Код AS3:
package
{
import flash.display.*;
import flash.geom.*;
public class Star extends Shape
{
public static const RADIUS:Number = 500;
public static const CENTER:Point = new Point(250, 250);
//3D координаты
private var _pX:Number;
private var _pY:Number;
private var _pZ:Number;
public function Star()
{
graphics.lineStyle(4, 0xFFFFFF);
graphics.lineTo(0.5, 0);
_pX = 2 * RADIUS * (0.5 - Math.random());
_pY = 2 * RADIUS * (0.5 - Math.random());
_pZ = 2 * RADIUS * (0.5 - Math.random());
rotate(0);
}
public function rotate(angle:Number):void
{
var sin:Number = Math.sin(angle);
var cos:Number = Math.cos(angle);
var ty:Number = _pX;
_pX = _pX * cos + _pZ * sin;
_pZ = _pZ * cos - ty * sin;
x = CENTER.x + _pX;
y = CENTER.y + _pY;
scaleX = scaleY = RADIUS / (RADIUS - _pZ);
var viewAngle:Number = Math.atan2(_pZ, _pX);
visible = viewAngle < 0;
}
}
}