Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3:具有透视投影的局部到全局_Actionscript 3_Projection_Perspectivecamera - Fatal编程技术网

Actionscript 3 AS3:具有透视投影的局部到全局

Actionscript 3 AS3:具有透视投影的局部到全局,actionscript-3,projection,perspectivecamera,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.dr

如果显示对象应用了透视投影,则调用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);

似乎设置
perspectiveProjection
不会强制玩家重新绘制对象,而
localToGlobal
取决于重新绘制以获得正确的结果。您可以像您发现的那样等待1个刻度(
setTimeout
0毫秒或
enterFrame
1帧即可),或者您可以使用
BitmapData/draw()强制播放器重画:


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

本应被否决。这个问题毫无意义,应该删除。用户应用2.5D(类似于3D)并询问有关localToGlobal方法的问题,该方法仅适用于2D,并且永远不会产生任何准确的结果,这就是local3DToGlobal等方法退出的原因。实际上,
local3DToGlobal
也存在同样的问题。OP指出,当更改
projectionCenter
时,来自
localToGlobal
的结果不匹配。我认为这是一个完全正确的问题。我个人不知道答案。有趣,很好的发现。似乎设置
perspectiveProjection
不会触发播放器重画,这取决于
localToGlobal
。仅供参考强制玩家重画的一个技巧是使用
新的位图数据(1,1).draw(s)
。我用你的代码对它进行了测试,它解决了问题。对你的答案进行了升级,但也添加了一个,以扩展“强制重画”的技巧。干杯
// ...

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