【问题标题】:AS3: localToGlobal with perspectiveProjectionAS3:localToGlobal 与透视投影
【发布时间】:2016-01-12 07:25:45
【问题描述】:

似乎如果显示对象应用了透视投影,则调用 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.5D(类似于 3D)并询问有关 localToGlobal 方法的问题,该方法仅是 2D 并且永远不会产生任何准确的结果,这就是 local3DToGlobal 等方法退出的原因。
  • 其实local3DToGlobal也有同样的问题。 OP 指出当 projectionCenter 更改时,localToGlobal 的结果不匹配。我认为这是一个完全有效的问题。我个人不知道答案。

标签: actionscript-3 projection perspectivecamera


【解决方案1】:

似乎设置perspectiveProjection 不会强制玩家重绘对象,而localToGlobal 取决于重绘以获得正确的结果。你可以像你发现的那样等待 1 个滴答声(setTimeout 0ms 或 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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 有趣,很好的发现。似乎设置perspectiveProjection 不会触发玩家重绘,这取决于localToGlobal。仅供参考,强制玩家重绘的技巧是使用new BitmapData(1, 1).draw(s)。我用你的代码测试了它,它解决了这个问题。
    • 赞成您的答案,但也添加了一个以扩展“强制重绘”技巧。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2018-05-03
    • 2013-11-26
    • 2015-08-06
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多