2 votes

Five3d local3dtoglobal

Je suis en train d'essayer d'utiliser le package Five3d pour dessiner un sprite en 3D et l'animer puis créer une forme à la racine de l'application et la superposer sur le sprite en 3D pendant qu'il se déplace. J'ai tout essayé pour le faire fonctionner mais je n'arrive pas à l'aligner correctement. On dirait que la perspective est faussée. J'ai réussi à le faire fonctionner après avoir inspecté la relation entre les coordonnées 3D x,y et les coordonnées globales x,y, ce qui m'a amené à écrire la méthode 'local3dToGlobalXY' ci-dessous, mais cela n'a fonctionné que lorsque la scène était de 1024 / 768, étrange. On m'a dit que Sprite2d dans le package Five3d le faisait mais je n'arrive pas non plus à le faire fonctionner. Il donne les mêmes résultats que ma méthode 'local3dToGlobalXY'.

J'ai mis un exemple ici : ici et le projet de l'exemple est ici.

L'étoile rouge est un sprite en 3D et les deux réticules sont dessinés dans des portées différentes. L'un est dessiné dans un Sprite2d comme on me l'a recommandé, et l'autre est dessiné dans la racine.

J'espère que quelqu'un a rencontré ce problème ou peut me dire ce que j'ai mal fait.

Merci, J

/**
 * ...
 * @author James Jordan
 */
public class Main extends Sprite 
{

    private var s3D:Sprite3D;
    private var _scene:Scene3D;
    private var _s:Sprite3D;
    private var star3D:Shape3D;
    private var t:Timer;
    private var crossHairs2D:Sprite;
    private var otherPlane:Sprite2D;
    private var _plane:Sprite3D;
    private var crossHairsRoot:Sprite;
    private var animationPlane:Sprite3D;
    private var crossHairsPlane:Sprite2D;
    private var starsPlane:Sprite3D;

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

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point
        stage.align = StageAlign.TOP_LEFT;
        stage.scaleMode = StageScaleMode.NO_SCALE;

        animationPlane = new Sprite3D();

        starsPlane = new Sprite3D();
        animationPlane.addChild(starsPlane);

        crossHairsPlane = new Sprite2D();
        animationPlane.addChild(crossHairsPlane);

        _scene = new Scene3D();
        _scene.x = stage.stageWidth / 2;
        _scene.y = stage.stageHeight / 2;

        _scene.addChild(animationPlane);

        addChild(_scene);

        star3D = drawStar(starsPlane);
        crossHairs2D = drawGlobalShape(crossHairsPlane, 0xff000, 10);
        crossHairsRoot = drawGlobalShape(root, 0x0000ff, 5);

        t = new Timer(1000, 0);
        t.addEventListener(TimerEvent.TIMER, onTimer);
        t.start();

    }

    private function onTimer(e:TimerEvent):void 
    {
        TweenLite.to(star3D, 1, { x:(Math.random() * stage.stageWidth) - (stage.stageWidth/2), y:(Math.random() * stage.stageHeight) - (stage.stageHeight / 2), z:(Math.random() * 500), onUpdate:onTweenUpdate } );
    }

    private function onTweenUpdate():void 
    {
        var p:Point = local3dToGlobalXY(starsPlane, new Point3D(star3D.x, star3D.y, star3D.z));
        crossHairs2D.x = p.x - stage.stageWidth / 2;
        crossHairs2D.y = p.y -  stage.stageHeight / 2;

        crossHairsRoot.x = p.x;
        crossHairsRoot.y = p.y;
    }

    private function local3dToGlobalXY(_s:Sprite3D, p3d:Point3D):Point 
    {
        var m:Matrix3D = _s.concatenatedMatrix;
        var newP3d:Point3D = m.transformPoint(p3d);
        var globalPoint:Point = _s.local3DToGlobal(new Vector3D(newP3d.x, newP3d.y, newP3d.z));
        return globalPoint;
    }

    private function drawStar(parent:Sprite3D):Shape3D {

        var starShape:Shape3D = new Shape3D();
        DrawingUtils.star(starShape.graphics3D, 5, 30, 20, (45 / 180) * Math.PI, 0xff0000);

        parent.addChild(starShape);

        return starShape;
    }

    private function drawGlobalShape(p:*, c:uint, lineWeight:Number):Sprite 
    {
        var d:Sprite = new Sprite();
        d.graphics.lineStyle(lineWeight, c);
        d.graphics.moveTo( -20, 0);
        d.graphics.lineTo(20, 0);
        d.graphics.moveTo( 0, -20);
        d.graphics.lineTo(0, 20);
        d.graphics.endFill();

        p.addChild(d);

        return d;

    }

}

0voto

Gone3d Points 1189

C'est votre perspective et votre coordonnée Z. Supprimez le changement Z aléatoire dans l'instruction TweenLite.to et vous verrez qu'ils s'alignent parfaitement.

Que cherchez-vous exactement à faire ici? Mis à part décaler l'étoile, le paramètre Z ne semble pas ajouter grand-chose (mise à l'échelle en fonction de la distance de l'observateur)?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X