Quando comecei a tentar fazer as coisas com o 3D nativo do Flash achei que seria uma boa idéia, mas com o passar do tempo algumas questões começaram a aparecer e percebi que existem alguns detalhes que realmente tem muito a melhorar.
Apesar disso, em alguns projetos onde o 3D é mais simples e com poucas animações e interatividade, tenho optado pelo 3D nativo. Nesses projetos, acabei me deparando com algumas situações e as saídas podem ser úteis para outras pessoas, o problema mais recente que tive foi com relação ao vanishing point (ponto de fuga) então vamos lá.
Nesse primeiro código estou apenas criando um MovieClip, posicionando no centro do stage e rotacionando no eixo Y, sem definir nada mais.
var _plane : MovieClip = addChild(new MovieClip()) as MovieClip;
_plane.graphics.beginFill(0x000000);
_plane.graphics.drawRect(0, 0, 200, 100);
_plane.graphics.endFill();
_plane.x = (stage.stageWidth - _plane.width) * .5;
_plane.y = (stage.stageHeight - _plane.height) * .5;
_plane.rotationY = -60;
E o resultado é esse:
Você pode usar o código abaixo e definir o vanishing point que desejar.
import flash.geom.PerspectiveProjection;
import flash.geom.Point;
var _plane = addChild(new MovieClip()) as MovieClip;
_plane.graphics.beginFill(0x000000);
_plane.graphics.drawRect(0, 0, 200, 100);
_plane.graphics.endFill();
_plane.x = (stage.stageWidth - _plane.width) * .5;
_plane.y = (stage.stageHeight - _plane.height) * .5;
_plane.rotationY = -60;
var _vp : PerspectiveProjection = new PerspectiveProjection();
_vp.projectionCenter = new Point(505, 285);
_plane.transform.perspectiveProjection = _vp;
Tendo como resultado:
Caso você tenha algum objeto no stage com alguma transformação 3D o vanishing point dele se torna o padrão para os demais objetos, logo, se você não definir nada no seu código, o resultado poderia ser algo do tipo:
Daí vem algumas questões; Posso ter vanishing point distinto para n Objetos?; Se um Display Object estiver dentro de um outro Display Object, qual será o ponto de referência do filho?
Vamos por partes, primeiro sobre distintos vanishing points. Diretamente na timeline eu não consegui – o que não quer dizer que seja impossível – criar pontos distintos para os objetos que sofreram transformação 3D, porém, via código isso é possível.
import flash.geom.PerspectiveProjection;
import flash.geom.Point;
var _vp : PerspectiveProjection = new PerspectiveProjection();
/** Primeiro plano **/
var _plane = addChild(new MovieClip()) as MovieClip;
_plane.graphics.beginFill(0x000000);
_plane.graphics.drawRect(0, 0, 200, 100);
_plane.graphics.endFill();
_plane.x = (stage.stageWidth - _plane.width) * .5;
_plane.y = 20;
_plane.rotationY = -60;
_vp.projectionCenter = new Point(505, 285);
_plane.transform.perspectiveProjection = _vp;
/** Segundo plano **/
var _plane2 = addChild(new MovieClip()) as MovieClip;
_plane2.graphics.beginFill(0x000000);
_plane2.graphics.drawRect(0, 0, 200, 100);
_plane2.graphics.endFill();
_plane2.x = (stage.stageWidth - _plane.width) * .5;
_plane2.y = 140;
_plane2.rotationY = -60;
_vp.projectionCenter = new Point(105, 285);
_plane2.transform.perspectiveProjection = _vp;
Que resulta em:
Sobre a relatividade do vanishing point, se você tiver um MovieClip com transformação 3D no root e outro dentro de um container, o ponto é o mesmo e sempre com relação ao stage.
Na imagem abaixo existem 2 MovieClips, o mais claro está no root e o mais escuro está dentro de um container na posição 600, 350 e seu container foi alinhado para ficar lado a lado com o primeiro MovieClip (o mais claro). Perceba que mesmo o MovieClip filho estando na posição 600, 350 de seu container, o que vale de fato para o Flash é onde no stage ele se encontra.