AS3:使用perspectiveProjection的localToGlobal

时间:2016-01-12 07:25:46

标签: actionscript-3 projection perspectivecamera

似乎如果显示对象应用了透视投影,则调用localToGlobal会给出错误的坐标。在下面的代码中,我绘制一个矩形,围绕其X轴稍微旋转,然后使用从localToGlobal派生的坐标在其中绘制一个椭圆。它工作正常,直到我尝试应用透视投影,然后坐标都是错误的。任何人都知道如何解决这个问题?

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);

2 个答案:

答案 0 :(得分:1)

似乎设置perspectiveProjection不会强制玩家重绘对象,而localToGlobal依赖于重绘以获得正确的结果。您可以像找到的那样等待1个刻度(setTimeout表示0毫秒或enterFrame表示1帧)或者您可以强制播放器使用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 :(得分:1)

我找到了一个并不可怕的解决方法。您需要做的就是在localToGlobal调用之前稍微延迟,然后它们将返回正确的坐标。这也修复了local3DToGlobal。