Имитация перспективной проекции
Задача - не применяя к объекту перспективной проекции, поместить его именно в ту
позицию, куда бы он попал, будь она применена.
"Погуглив", я решил, что должен помочь метод Utils3D.projectVector в связке с toMatrix3D().
Однако, улетаю куда-то в преисподнюю. Как сделать ????
Заранее благодарен.
Вот класс:
Код AS3:
package
{
import flash.display.Sprite;
import flash.geom.Matrix3D;
import flash.geom.Point;
import flash.geom.Vector3D;
import flash.geom.Utils3D;
import flash.geom.PerspectiveProjection;
import flash.events.*;
public class ImitPP extends Sprite
{
var box:Sprite;
var box2:Sprite;
var pp:PerspectiveProjection;
var deltaFOV:int = 15;
public function ImitPP():void{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
public function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
createBoxes();
pp = new PerspectiveProjection();
pp.projectionCenter = new Point(0,0);
box.transform.perspectiveProjection = pp;
stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);
}
public function reportKeyDown(event:KeyboardEvent):void {
deltaFOV = -deltaFOV;
pp.fieldOfView += deltaFOV;
if (String.fromCharCode(event.charCode) == "c") {
var mat3D:Matrix3D = pp.toMatrix3D();
var v3D:Vector3D = Utils3D.projectVector(mat3D, box.transform.matrix3D.position);
box.transform.matrix3D.position = v3D;
}
if (String.fromCharCode(event.charCode) == "a") {
box.transform.perspectiveProjection = pp;
}
}
public function createBoxes():void {
box= new Sprite();
box.graphics.beginFill(0xCCCCFF);
box.graphics.drawRect(0, 0, 500, 500);
box.graphics.endFill();
box.x = 100;
box.y = 100;
box.z = 50;
addChild(box);
box2= new Sprite();
box2.graphics.beginFill(0x0000ff);
box2.graphics.drawRect(0, 0, 100, 100);
box2.graphics.endFill();
box2.x = 50;
box2.y = 50;
box2.z = 100;
box.addChild(box2);
}
}
}
|