2009-11-05 53 views
1

我需要知道在更改rotationX值后显示对象的可见高度。3D,AS3,Flex - 将旋转度转换为可见高度

我有一个应用程序,允许用户在3D空间布局楼层。我希望地板的大小在3D旋转后自动伸展,以便它始终覆盖某个区域。

任何人都知道这样做的公式吗?

编辑:我想我真的想要做的是转换度数像素。

在2D平面上表示100 x 100像素,旋转时-10度变化意味着该平面在顶部有间隙,不再可见。我想知道这个缝隙有多少像素,以便我可以拉伸飞机。

在Flex中,显示对象height属性的值在应用旋转之前和之后都保持不变,这实际上可能是一个错误。

编辑2:必须有一个通用的数学公式来解决这个问题,而不是Flash/Flex特定的东西。在3D空间中查看对象时,如果对象向后旋转(对象翻转顶部远离查看器),则新可见高度根据旋转角度是什么?这可能是像素,米,肘或其他。

+0

而不是试图平铺一堆旋转的单个图像,为什么不平铺图像在一个平面上,然后旋转整个飞机? – greggreg 2009-11-05 15:38:54

+0

对不起,如果我不清楚。这正是我计划要做的。我需要测量旋转后整个飞机的可见高度。 – Daniel 2009-11-05 15:53:05

回答

0

我没有测试的情况下,但把我的头顶部我猜是这样的:

var d:DisplayObject; 
var rotationRadians:Number = d.rotationX * Math.PI/180; 
var visibleHeight:Number = d.height * Math.cos(rotationRadians); 

这不采取任何其他转换进去,虽然。

+0

完美。这正是我之后的事情。我觉得Flash应该在后台执行此操作,然后自动暴露该值。我似乎在使用内部3D软件包时遇到了很多怪癖,与PPV或Away3D等相反。也许未来的更新会更直观。 有关如何获取对象新宽度的任何想法(根据+ xRotation或-xRotation,在顶部还是底部较小)? – Daniel 2009-11-12 11:46:42

+1

很高兴我能帮到你。 假设没有内置的方法(我还没有使用Flash的3D) - 对于比单次旋转更复杂的任何事情,您可能需要: 1.构建一个旋转矩阵 2.通过矩阵将显示对象边界框的每个角的坐标乘以矩阵以获得其新的“旋转”坐标 3.使用某个除法的每个坐标的z值将x和y转换为适当的量,原点 4.创建这些已转换坐标的边界框并使用它的宽度和高度。 – 2009-11-13 09:51:52

0

您是否尝试过使用对象的边界矩形并进行测试?

var dO:DisplayObject = new DisplayObject(); 
dO.rotation = 10; 
var rect:Rectangle = dO.getRect(); 

// rect.topLeft.y is now the new top point. 
// rect.width is the new width. 
// rect.height is the new height. 

至于楼层,我需要更多的信息,但你有没有尝试过设置floor.percentWidth = 100?这可能会起作用。

+0

没有运气。看起来,尽管可见高度和y不同,但显示对象高度和y(在本例中为包含位图的画布)在调整3d旋转时不会改变。边界矩形似乎也是这样做的。 该地板将由多个方形瓷砖组成。我计划在3d旋转之后在地板上添加单个瓷砖的行或列,直到地板面积达到目标y位置。在地板顶部将增加一个带有墙壁和家具的PNG。 PNG的地板面积将是透明的,可让地板图像显示出来。 – Daniel 2009-11-05 15:36:50

0

您是否检查过DisplayObject.transform.pixelBounds?我没有尝试过,但考虑轮换可能更有可能。

0

旋转实际上改变了DisplayObject的轴(即旋转x和y轴)。这就是为什么你没有看到高度的差异。所以为了获得视觉的高度和你可以试试这个。

var dO:DisplayObject = new DisplayObject(); 
addChild(); 
var rect1:Rectangle = dO.getRect(dO.parent); 
dO.rotation = 10; 
var rect2:Rectangle = dO.getRect(dO.parent); 
在这种情况下,rect1和rect2应该不同。如果你想检查dO的视觉坐标,那么只需要用root改变dO.parent即可。

+0

我没有得到我需要的结果。这是否适用于3D旋转(rotationX,... Y,... Z)呢? – Daniel 2009-11-07 17:57:51

+0

你能提供一些代码吗? – bhups 2009-11-07 20:50:58