【问题标题】:3D, AS3, Flex - Convert degrees of rotation to visible height3D、AS3、Flex - 将旋转度数转换为可见高度
【发布时间】:2009-11-05 15:05:04
【问题描述】:

我需要知道在我更改它的 rotationX 值后显示对象的可见高度。

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

有人知道这个公式吗?

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

在 2D 平面上,比如 100 x 100 像素,rotationX 的 -10 度变化意味着平面在顶部有一个不再可见的间隙。我想知道这个间隙有多少像素,以便我可以拉伸平面。

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

编辑 2:必须有一个通用的数学公式来解决这个问题,而不是 Flash/Flex 特定的东西。在 3D 空间中查看对象时,如果对象向后旋转(对象顶部翻跟头远离观察者),新的可见高度将基于旋转度数是多少?这可以以像素、米、肘或其他为单位。

【问题讨论】:

  • 与其尝试平铺一堆旋转的单个图像,不如将图像平铺在一个平面上,然后旋转整个平面?
  • 对不起,如果我不清楚。这正是我打算做的。我需要测量旋转后整个平面的可见高度。

标签: apache-flex flash actionscript-3 3d papervision3d


【解决方案1】:

我没有测试用例,但在我的脑海中,我猜想是这样的:

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

不过,这并没有考虑任何其他转换。

【讨论】:

  • 完美。这正是我所追求的。我觉得 Flash 应该在后台执行此操作,然后自动公开该值。与 PPV 或 Away3D 等相比,我似乎在使用内部 3D 软件包时遇到了很多怪癖。也许未来的更新会更直观。关于如何获得对象的新宽度的任何想法(根据 +xRotation 或 -xRotation 在顶部或底部变小)?
  • 很高兴我能帮上忙。假设没有内置方法(我还没有玩过 Flash 的 3D)——对于任何比单次旋转更复杂的事情,你可能需要: 1. 构造一个旋转矩阵 2. 乘以显示对象边界框每个角的坐标通过矩阵得到它们的新“旋转”坐标 3. 使用每个坐标的 z 值进行一些除法,将 x 和 y 平移到原点适当的量 4. 创建边界这些翻译坐标的框并使用它的宽度和高度。
【解决方案2】:

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

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?这可能行得通。

【讨论】:

  • 不走运。似乎显示对象的高度和 y(在这种情况下是包含位图的画布)在调整其 3d 旋转时不会改变,即使可见高度和 y 不同。边界矩形似乎做同样的事情。地板将由多个方形瓷砖组成。我计划在 3d 旋转后将单个瓷砖的行或列添加到地板上,直到地板区域达到目标 y 位置。在地板的顶部将添加一个带有墙壁和家具的 PNG。 PNG 的地板区域将是透明的,允许地板图像显示出来。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    旋转实际上改变了 DisplayObject 的轴(即 x 和 y 轴被旋转)。这就是为什么您没有看到高度差异的原因。因此,为了获得视觉高度和 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 的视觉坐标,只需将 dO.parent 更改为 root。

    【讨论】:

    • 我没有得到我需要的结果。这是否也适用于 3D 旋转(rotationX、...Y、...Z)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多