2016-01-12 2 views
-1

Il semble que si un objet d'affichage a une projection de perspective appliquée, appel localToGlobal vous donne les mauvaises coordonnées. Dans le code suivant, je dessine un rectangle, le tourne légèrement autour de son axe X, puis dessine un ovale à l'intérieur en utilisant les coordonnées dérivées de localToGlobal. Cela fonctionne bien, jusqu'à ce que j'essaie d'appliquer une projection en perspective, alors les coordonnées sont toutes fausses. Quelqu'un sait comment contourner ce problème?AS3: localToGlobal avec perspectiveProjection

var w:uint = 300, h:uint = 150; 
var s:Sprite = new Sprite(); 
s.graphics.beginFill(0x000000); 
s.graphics.drawRect(-w/2,0,w,h); 
s.graphics.endFill(); 
s.x = 275; s.y = 200; s.z = 600; 
s.rotationX = -45; 
addChild(s); 

var point00:Point = new Point(0,0); 
var point0h:Point = new Point(0,h); 
var midL:Point = new Point(-w/2,h/2); 
var midR:Point = new Point(w/2,h/2); 

/*var VP:PerspectiveProjection = new PerspectiveProjection(); 
VP.fieldOfView = 55; 
var p:Point = new Point(275,100); 
VP.projectionCenter = p; 
s.transform.perspectiveProjection = VP;*/ 

var o:Shape = new Shape(); 
o.graphics.beginFill(0x00ff00); 
o.graphics.drawEllipse(
    s.localToGlobal(midL).x, 
    s.localToGlobal(point00).y, 
    s.localToGlobal(midR).x - s.localToGlobal(midL).x, 
    s.localToGlobal(point0h).y - s.localToGlobal(point00).y 
); 
addChild(o); 
+0

Voté comme prévu. La question est inutile et devrait être supprimée. L'utilisateur applique 2.5D (semblable à 3D) et pose la question au sujet de la méthode de LocalToGlobal qui est 2D seulement et ne produira jamais aucun résultat précis qui est pourquoi des méthodes comme local3DToGlobal sortent. – BotMaster

+1

En fait, 'local3DToGlobal' a le même problème. OP signale que lorsque 'projectionCenter' est modifié, les résultats de' localToGlobal' ne correspondent pas. Je pense que c'est une question parfaitement valable. Je ne connais pas personnellement la réponse. – Aaron

Répondre

1

Il semble que la mise en perspectiveProjection ne force pas le joueur à redessiner l'objet et localToGlobal dépend de redessiner des résultats corrects. Vous pouvez attendre 1 tick comme vous avez trouvé (setTimeout pour 0ms ou enterFrame pour 1 cadre le fera) ou vous pouvez forcer le joueur à redessiner en utilisant BitmapData/draw():

// ... 

s.transform.perspectiveProjection = VP; 

new BitmapData(1, 1).draw(s); // forces player to redraw the sprite 

var o:Shape = new Shape(); 
o.graphics.beginFill(0x00ff00); 
o.graphics.drawEllipse(
    s.localToGlobal(midL).x, 
    s.localToGlobal(point00).y, 
    s.localToGlobal(midR).x - s.localToGlobal(midL).x, 
    s.localToGlobal(point0h).y - s.localToGlobal(point00).y 
); 
addChild(o); 
1

Je trouve une solution de contournement qui est pas terrible. Tout ce que vous avez à faire est de mettre un peu de temps avant les appels localToGlobal et ensuite ils vont retourner les bonnes coordonnées. Cela corrige aussi local3DToGlobal.

+0

Intéressant, bonne trouvaille. Il semble que la définition de 'perspectiveProjection' ne déclenche pas le redrawing d'un joueur, qui dépend de' localToGlobal'. Pour info, un truc pour forcer le joueur à redessiner est d'utiliser 'new bitmapData (1, 1) .draw (s)'. Je l'ai testé avec votre code et cela résout le problème. – Aaron

+0

Vous avez augmenté votre réponse, mais vous en avez ajouté une pour développer l'astuce "forcer redessiner". À votre santé. – Aaron