【问题标题】:How can I load a Papervision/Flex application (SWF) as a material on a Papervision plane?如何将 Papervision/Flex 应用程序 (SWF) 作为材质加载到 Papervision 平面上?
【发布时间】:2011-03-25 01:07:05
【问题描述】:

我正在尝试构建一个类似于Whitevoid 使用的投资组合应用程序。我正在使用 Flex 4 和 Papervision3D 2。除了一个问题,我一切正常。当我尝试在其中一个平面上加载外部 SWF 作为材质时,我可以看到任何本机 Flex 或 Flash 组件处于正确位置,但 papervision 对象未正确渲染。看起来视口没有在嵌套的 swf 中设置。我已经在下面发布了加载 swf 的代码。

private function loadMovie(path:String=""):void
{
    loader = new Loader();
    request = new URLRequest(path);

    loader.contentLoaderInfo.addEventListener(Event.INIT, addMaterial);

    loader.load(request);
}

private function addMaterial(e:Event):void
{
    movie = new MovieClip();
    movie.addChild(e.target.content);
    var width:Number = 0;
    var height:Number = 0;
    width = loader.contentLoaderInfo.width;
    height = loader.contentLoaderInfo.height;

    //calculate the aspect ratio of the swf
    var matAR:Number = width/height;

    if (matAR > aspectRatio)
    {
        plane.scaleY = aspectRatio / matAR;
    }
    else if (matAR < aspectRatio)
    {
        plane.scaleX = matAR / aspectRatio;
    }

    var mat:MovieMaterial = new MovieMaterial(movie, false, true, false, new Rectangle(0, 0, width, height));

    mat.interactive = true;
    mat.smooth = true;
    plane.material = mat;
}

下面我贴了两张图片。第一张是应用程序自行运行的照片。第二个是在飞机上作为 MovieMaterial 的应用程序。您可以看到在 mxml 中创建为 spark 对象的按钮如何保持在正确的位置,但 papervision 球体(正在旋转)在错误的位置。我在这里有什么遗漏吗?

【问题讨论】:

    标签: actionscript-3 flex4 papervision3d


    【解决方案1】:

    男人。我有一段时间没看到那个网站了。仍然是更酷的光伏项目之一......

    什么意思:

    我无法正确看到 Papervision 中渲染的场景

    您说您可以在适当的位置看到组件,例如:您有一架飞机,看起来像预期的文件正在加载?但我猜你不能与之交互。

    据我所知,我已经花费了相当多的时间来尝试制作类似的作品,MovieMaterial(我假设您正在使用它)绘制您的 MovieClip 中存在的任何内容的位图,如果你将它设置为animated=true,然后它会渲染出一系列位图——等同于动画。它没有做的是在飞机上显示实际的 MovieClip(或 SWF)。因此,您可能会看到您的组件,但这就是:

    MovieMaterial.as 第 137 行

    // ______________________________________________________________________ CREATE BITMAP
    
            /**
            * 
            * @param    asset
            * @return
            */
            protected function createBitmapFromSprite( asset:DisplayObject ):BitmapData
            {
                // Set the new movie reference
                movie = asset;
    
                // initialize the bitmap since it's new
                initBitmap( movie );
    
                // Draw
                drawBitmap();
    
                // Call super.createBitmap to centralize the bitmap specific code.
                // Here only MovieClip specific code, all bitmap code (maxUVs, AUTO_MIP_MAP, correctBitmap) in BitmapMaterial.
                bitmap = super.createBitmap( bitmap );
    
                return bitmap;
            }
    

    请注意,在 WhiteVoid 中,您从未真正与电影互动,直到它“着陆”= 他很可能在位图纹理平面顶部交换电影。

    您正在与之交互的部分可能是另一个平面,其中包含在鼠标悬停时变得可见的“按钮”。

    我认为 PV1.0 可以访问真正的 swfs 作为材料,但在 2.0 中发生了变化。可悲的是。希望 Molehill 会。

    干杯

    【讨论】:

    • 我为您添加了更多信息,以及一个示例。我可以很好地与按钮交互,我可以看到球体在旋转。它只是没有正确缩放或重新定位球体。
    • 您使用的是什么版本的 PV?有趣的是你让它工作,我有完全相同的设置,没有快乐......所以无论如何 - 内容正在显示,但未对齐。因此,请查看 Viewport.autoScaleToStage 道具。它默认设置为false,所以尝试“true”。或者,您是否在 swf 中设置了 stageScaleMode / stageAlign?对齐到 TOP_LEFT 也可以为您解决这个问题。
    • 我正在使用最新的发布版本,2.1.932。我已经尝试过两种方式的缩放,但它似乎从来没有工作过。我刚刚离开了缩放模式并对齐为它们的默认值。我希望能够获取由另一个开发人员/组创建的 swf 并使用它,而不管这些设置如何。我的飞机非常小,两个方向只有几百个像素,所以我认为它可能只是达到最小值。我有点希望嵌入式 swf 将平面用作舞台而不是浏览器,并且嵌入式场景将被平面缩放。
    • 嗯.. 我怀疑是否存在某种最小值。它看起来确实正在发生 - 加载的 swf 不是使用飞机作为它的阶段,而是使用父阶段。球体是否随着父容器的比例移动?很难说。 stageScaleModes 和嵌套阶段的一些奇怪的交互......您可以尝试缩小加载的电影以匹配您应用它的平面的大小,而不是相反。
    • 即使在移动和调整整个窗口大小时,球体也会保持相同的位置并随平面缩放。如果您在将影片添加到材质之前对其进行缩放,则它只会将其向后拉伸以适合平面。我可能错了,但看起来应用材料总是会填满整个平面。
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多