note.x

[PV3D2.0] materials.MovieMaterial

e_moviematerial.jpg

moviematerial_test.swf(要:FlashPlayer9)

tera@trick7さんが、メディアテクノロジーラボブログに投稿されたエントリー「Papervision3D の平面に外部 swf をロード」に、大きなお世話だけど補足を入れてみる。

MovieMaterial 第2引数の transparent は、第1引数で指定したDisplayObjectのAlpha値をサポートするかどうかを決める要素。これに関しては、Aquiouxさんが書かれた詳細な記事で解説されている通り。(PV3Dのマテリアルに関するAquiouxさんの解説は、1.5〜1.7ベースの記事ですが、PV3D2.0でも当てはまる部分がほとんどなので、かなり参考になると思います。)

teraさんのコードの

//読み込むムービーの背景色と同じ塗りの色にする
exStageSpr.graphics.beginFill(0xFF3300);
・・・
//exStageSprをテクスチャに設定する。
var movieMat:MovieMaterial = new MovieMaterial(exStageSpr, false, true, false);

の部分を

//読み込むムービーの背景色と同じ塗りの色にする
exStageSpr.graphics.beginFill(0xFF3300, 0.5);
・・・
//exStageSprをテクスチャに設定する。
var movieMat:MovieMaterial = new MovieMaterial(exStageSpr, true, true, false);

に変えることで、背面の赤が半透明になる。逆に、外部から読み込んだSWF内に半透明塗りされた部分があるなら、transparentをtrueにしないと狙った結果にならない。

次に第4引数の precise は、PV3D1.7で Precise〜Material という個別のクラスとして実装されてたものが、BitmapMaterialに組み込まれて、パラメータ指定できるようになったもの。いわゆるパースペクティブコレクトの on/off 設定。重めの処理だけど、予めメッシュを細かく分割しておかなくてもテクスチャのゆがみが目立たなくなる。

preciseについての詳細は別エントリにて

というあたりを使ってみたのが冒頭のデモ。

var movieMat_tf:MovieMaterial = new MovieMaterial(loadSWF,false,true,true);
var movieMat_tt:MovieMaterial = new MovieMaterial(loadSWF,true,true,true);

と、transparentの設定だけを変えた2つのマテリアルを、背中合わせに配置した2枚のPlaneそれぞれに割り当てた。

以下、簡略版ソース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.display.Loader;
    import flash.net.URLRequest;
 
    import org.papervision3d.view.BasicView;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.materials.MovieMaterial;
    import org.papervision3d.materials.WireframeMaterial;
 
    [SWF(backgroundColor=0x000000)]
 
    public class moviematerial_sample extends BasicView
    {
        private var loadSWF:Sprite;
        private var objPlaneA:Plane;
        private var objPlaneB:Plane;
        private var rotateAngle : Number = 0;
 
        public function moviematerial_sample()
        {
            stage.frameRate = 60;
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.MEDIUM;
 
            super (0,0,true,true,"Target");
            init();
        }
 
        private function init():void
        {
            loadSWF = new Sprite();
            loadSWF.graphics.beginFill(0xFFFFFF,0.6);
            loadSWF.graphics.drawRect(0, 0, 480, 360);
            loadSWF.graphics.endFill();
 
            var loader:Loader = new Loader();
            loadSWF.addChild(loader);
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
            loader.load(new URLRequest("external.swf"));
 
            function loadComplete(e:Event):void
            {
                init3D();
            }
        }
 
        private function init3D():void
        {
            camera.z = -2400;
            camera.fov = 30;
 
            var movieMat_tf:MovieMaterial = new MovieMaterial(loadSWF,false,true,true);
            objPlaneA = new Plane( movieMat_tf, 480, 360, 1, 1 );
            scene.addChild(objPlaneA);
            objPlaneA.yaw(180);
 
            var movieMat_tt:MovieMaterial = new MovieMaterial(loadSWF,true,true,true);
            objPlaneB = new Plane( movieMat_tt, 480, 360, 1, 1 );
            scene.addChild(objPlaneB);
 
            var wireMat:WireframeMaterial = new WireframeMaterial(0x666666);
            var floor:Plane = new Plane( wireMat, 700, 700, 3, 3 );
            scene.addChild(floor);
            floor.z = 350;
 
            startRendering();
        }
 
        override protected function onRenderTick(event:Event=null):void
        {
            objPlaneA.yaw(-2);
            objPlaneB.yaw(-2);
 
            super.onRenderTick(event);
        }
    }
}

08/09/17追記:

タロタローグさんの『Papervision3DのMovieMaterialの挙動がよく分からん。スクリプトでのアニメーションじゃ駄目なのかな。』からトラックバックをいただいたので、スクリプト制御でDisplayObjectをアニメーションさせている外部SWFを読み込んでMovieMaterialに割り当てるってのをやってみた。

■読み込まれる(MovieMaterialに割り当てる)側のソース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package
{
    import flash.display.Stage;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.text.AntiAliasType;
 
    //import flash.filters.BlurFilter;
 
    [SWF(backgroundColor=0x000000)]
 
    public class matSwf extends Sprite
    {
        private var bg:Sprite;
 
        public function matSwf()
        {
            if ( this.stage != null ) init( this.stage );
        }
 
        public function init( s:Stage ):void
        {
            s.frameRate = 50;
            s.align = StageAlign.TOP_LEFT;
            s.scaleMode = StageScaleMode.NO_SCALE;
            s.quality = StageQuality.BEST;
 
            bg = new Sprite();
            bg.graphics.beginFill(0x006699,0.7);
            bg.graphics.drawRect(0, 0, 480, 360);
            bg.graphics.endFill();
            addChild(bg);
 
            for (var i:int = 0; i < 15; i++)
            {
                var tf:TextField = new TextField();
                tf.autoSize = TextFieldAutoSize.LEFT;
                tf.selectable = false;
                tf.antiAliasType = AntiAliasType.ADVANCED;
 
                var tfm:TextFormat = new TextFormat();
                tfm.font = "Arial";
                tfm.color = 0x0099CC;
                tfm.size = 24 + (Math.random()*40 - 10);
                tfm.letterSpacing = -3;
                tf.defaultTextFormat = tfm;
                tf.text = "THE WORDS OF THE PROPHETS ARE WRITTEN ON THE SUBWAYWALLS AND TENEMENT HALLS.";
                addChild(tf);
 
                //tf.filters = [new BlurFilter(Math.random()*10,Math.random()*10,1)];
                tf.x = i*100 + Math.random()*150;
                tf.y = (bg.height - tf.height)/2 + (Math.random()*300 - 150);
                tf.addEventListener(Event.ENTER_FRAME, loop);
            }
        }
 
        private function loop(e:Event):void
        {
            e.target.x -= 2;
            if (e.target.x < -e.target.width) e.target.x = 480;
        }
    }
}

■PV3Dシーン側のソース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.geom.*;
    import flash.text.*;
 
    import org.papervision3d.view.BasicView;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.materials.MovieMaterial;
    import org.papervision3d.materials.WireframeMaterial;
 
    [SWF(backgroundColor=0x000000)]
 
    public class moviematerial_sample extends BasicView
    {
        private var loadSWF:Sprite;
        private var objPlane:Plane;
 
        public function moviematerial_sample()
        {
            stage.frameRate = 50;
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.MEDIUM;
 
            super (0,0,true,true,"Target");
            init();
        }
 
        private function init():void
        {
            loadSWF = new Sprite();
 
            var loader:Loader = new Loader();
            loadSWF.addChild(loader);
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
            loader.load(new URLRequest("matSwf.swf"));
        }
 
        private function loadComplete(e:Event):void
        {
            e.target.loader.content["init"]( stage );
            init3D();
        }
 
        private function init3D():void
        {
            camera.x = 500;
            camera.z = -1500;
            camera.fov = 30;
 
            var movieMat_tt:MovieMaterial = new MovieMaterial(loadSWF,true,true,true, new Rectangle(0,0,480,360));
            movieMat_tt.doubleSided = true;
            objPlane = new Plane( movieMat_tt, 480, 360, 1, 1 );
            scene.addChild(objPlane);
 
            var wireMat:WireframeMaterial = new WireframeMaterial(0x666666);
            var floor:Plane = new Plane( wireMat, 700, 700, 3, 3 );
            scene.addChild(floor);
            floor.z = 350;
 
            startRendering();
        }
 
        override protected function onRenderTick(event:Event=null):void
        {
            objPlane.yaw(-1);
            super.onRenderTick(event);
        }
    }
}

上記の実行結果(要:FlashPlayer9)

て感じで、スクリプト制御でDisplayObjectをアニメーションさせている場合でもMovieMaterialに割り当てることはできるみたい。ただ、やっぱりこのマテリアルは重い。上の読み込まれる側のソースで、ブラーフィルタ部分をコメントアウトしてるのは、やたら重かったから。

タロタローグさんが挙げている3つの残念ポイント

  • 滑らかだったアニメーションは見る影も無くガタガタで、時々思い出したように表示が更新され、記事タイトルが大移動している
  • newした方(背景透明)は、何故か幅の認識がおかしいようで、ラベルが2つ(消え行く用と出て来る用)見えてしまっている。
  • swf読み込みの方は、大きさが元々の640×480になっているらしく、3D化したものは多分左上しか出てきていない

のうち2つ目と3つ目は、いつ仕様変更で追加されたか忘れたけど、MovieMaterialの第五引数として渡すクリッピング用Rectangleオブジェクトの指定で解決できそうな気がする。クリッピング範囲を指定しないとステージ上に配置されているオブジェクトがテクチャの範囲に収まるように辻褄合わせしてしまうので、表示したくない部分まで表示されたり縦横比が変わったりする。
1つめの残念ポイントについては、よくわかんないけどブラーフィルタとかが重いせいかも。

いずれにしても MovieMaterial に割り当てるムービーを、かなりシンプルにしないとキツそうな感じですな。


TRACKBACK

  1. タロタローグ ブログ - 2008.09.16 2:07:52

    Papervision3DのMovieMaterialの挙動がよく分からん。スクリプトでのアニメーションじゃ駄目なのかな。

    まず、俺が初めてAS3.0で作ってみた、「Matrix風RSS表示」のサンプルを作り直してみた。そのdemoがこちら。
    で、次にこの辺りを参考にして、こいつをPapervision3DのMovieMaterial使って読み込ん…

  2. タロタローグ ブログ - 2008.09.18 23:30:54

    note.xさん有難う御座います!!(全ての原因は、第5引数のRectangleだった説)

    以前のエントリで、MovieMaterialにスクリプトアニメーションを行うswfファイルやSpriteを放り込んだら挙動が酷い事になったという悩みを書き、note.xさんにTBを投げてみた所、有り難い事に…

Trackback URL : http://blog.r3c7.net/as3-software-rendering/176/trackback/

COMMENTS

  1. tera - 2008.04.12 19:37:45

    rect様
    ご丁寧にありがとうございます!参考にさせていただきます。
    やっとPV3Dを触りだした僕の初心者記事を note.x さんに見ていただいて、恥ずかしいやら、でもフォローしてくださって嬉しいやらですw。
    引き続き note.x さんのブログを拝見しまくって勉強させていただきます。ありがとうございましたー。

  2. rect - 2008.04.13 1:07:08

    teraさん

    こちらこそteraさんの翻訳記事等で大変お世話になってますので、恩返しのつもりで補足させていただきました。とはいうものの、結局は茶々入れるような感じになっちゃって正直ウザいよなーと思ってただけに、そう言っていただけてホッとしました。teraさんの持ち味が活かされた面白い作品を期待してます。

  3. takki - 2008.04.22 17:09:11

    rect様

    はじめまして、いつもブログで勉強させてもらってます takkiと申します。

    周りにrect様ほどPV3Dに精通している人がいないのでこの場を借りて伺いたいのですが

    PV3D1.0の時はDisplayObject3Dに動的にMaterialを代入できたのですが
    (floor.material=movieMat_tt;みたいな感じで。。)

    PV3D2.0から直接代入しても反映されなくなっていますでしょうか?

    WireframeMaterialからBitmapMaterialに途中で変更したり
    とかをしたいのですがPV3D2.0でもPV3D1.0の時のような軽いのりで
    マテリアルの変更する方法とかご存知でしょうか?

    初心者で恐縮ですが教えていただけると大変嬉しいです。

  4. rect - 2008.04.22 19:01:14

    takkiさん

    >マテリアルの変更する方法

    アテにならない記憶によると、リビジョン513あたりでTriangleMesh3Dにパッチが当たって、materialのセッターが追加されました。なので、takkiさんのご希望通りの記述でマテリアルの変更ができます。一応、動作確認してみたんで大丈夫だと思います。

    動作確認デモ:
    http://blog.r3c7.net/wp-content/uploads/materialChange/runtimeMatChange.swf

    ということで、最新リビジョン使えばイケるかと。

  5. takki - 2008.04.22 21:50:09

    rect様

    ありがとうございます!サンプルまでご用意いただいて感激です(涙
    完璧でした! こまめに更新をチェックしないといけないものですね
    なかなか追いつけない調子です。。。汗
    本当ありがとうございました!

  6. アムロ - 2009.01.27 2:17:48

    すいません、ちょっと質問なのですが、
    ご紹介されている記事のような方法でSWFを読み込んだのですが、
    ロードしたSWFにあるボタンイベントとかは利かなくなってしまうのでしょうか。

    ボタンイベント以外は動いているっぽいのですが・・・。
    あと右側が50〜100pxほど切れてしまうのも何か原因があるのでしょうか。。

    質問ばかりすいません。

  7. rect - 2009.01.27 13:01:17

    > アムロさん

    質問が漠然としてるのでなんとも言えませんが
    基本的に、

    ・viewportの interactive プロパティを true に
    ・該当マテリアルの interactive プロパティを true に
    ・該当マテリアルを適応するオブジェクトの useOwnContainer を true に

    それぞれ設定することでいけるはずです。
    以下、適当ですが動作サンプルです。テキスト部分がMOUSE_UPで反応します。
    http://blog.r3c7.net/wp-content/uploads/materials/MovieMaterial/moviematerial_sample_me.swf

    このあたりのことは、MLにも情報があります。
    http://www.nabble.com/MouseEvent-on-MovieMaterial-sprite-in-papervision3d-2.0-td20530212.html

    >あと右側が50〜100pxほど切れてしまう

    MovieMaterialの第五引数で指定するRectangleは設定されてますでしょうか?

  8. アムロ - 2009.01.30 21:57:06

    rect様ありがとうございます!
    教えていただいた通り各引数をtrueに設定する事でボタンイベント動きました!
    でもAS2.0のSWFを読み込むとやっぱり利かないですね。そりゃ当たり前か。。

    右側が切れてしまう件はもう少し検証してみます。
    Rectangleでもサイズは指定しているのですが。

    本当にありがとうございました!
    また来ます。。

  9. k2 - 2009.02.26 19:16:58

    rect様

    すみません。ちょっと質問させてください。
    rect様の書かれた上の簡略版ソースにおきまして、planeに貼付けるSWFとして、テキストフィールドに外部htmlを読み込んでパブリッシュしたものを使おうとしているのですが、ちゃんと表示はされるもののリンクがクリックできなくってしまいます。
    またボタンイベントがあるSWFファイルを埋めこんだテキストフィールドを同じ要領でplaneに貼付けてやっても上と同じでボタンでクリックできなくなってしまいます。
    おそらくアムロさんのご質問と同じ内容なのでしょうが、何ぶんPV3DはおろかFlashを触り始めてまだ10日ほどですので、rect様が上に書かれている解決方法が理解できずに困っています。すみませんが具体的にソースにどういったものを書き加えればうまくいくのか教えていただけないでしょうか?

  10. rect - 2009.02.26 23:29:53

    >k2さん

    PV3D側での設定は、アムロさんへの回答で書いた通りです。
    具体的にコードを示すなら、下記のようになると思います。

    ■viewportの interactive プロパティを true に
    エントリ内のサンプルコードのように、BasicViewを継承しているなら、
    super (0,0,true,true);
    と、BasicViewのコンストラクタ第四引数をtrueに設定。

    BasicViewを使っていないのなら、
    var viewport:Viewport3D = new Viewport3D(0, 0, true, true);
    と、こちらもコンストラクタ第四引数をtrueに設定。

    ■該当マテリアルの interactive プロパティを true に
    var movieMat:MovieMaterial = new MovieMaterial( loadSWF );
    movieMat.interactive = true;

    ■該当マテリアルを適応するオブジェクトの useOwnContainer を true に
    var objPlane:Plane = new Plane( movieMat, 480, 360, 1, 1 );
    scene.addChild(objPlane);
    objPlane.useOwnContainer = true;

    PV3D側の設定は以上です。
    ただ、htmlプロパティを有効にしたTextFieldをマテリアルに指定する方法は試した事が無いので、全てが正しく設定されていたとして、仕様上、可能なのかどうかわかりかねます。ご了承ください。

  11. k2 - 2009.02.27 16:35:53

    rect様

    やってみましたが、htmlプロパティを有効にしたTextFieldをマテリアルに指定するほうはうまくいきませんでした。違う方法を考えてみます。

    丁寧なご指摘どうもありがとうございました。

    k2

  12. cube - 2009.02.28 18:45:39

    rect様

    上の簡略版ソースを抜粋して次のようなソースを書いてみましたがどうもうまく画面にplaneオブジェクトが表示されません。

    ***********************************************************************************************
    package {
    import flash.display.*;
    import flash.events.*;
    import flash.filters.*;
    import flash.geom.*;
    import flash.events.Event;
    import flash.net.URLRequest;

    import org.papervision3d.view.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.view.*;
    import org.papervision3d.events.*;
    import org.papervision3d.cameras.*;

    import fl.transitions.Tween;
    import fl.transitions.easing.*;

    public class Main extends BasicView {
    static private const CIRCLE_RANGE :int = 150;
    static private const OBJ_LENGTH :int = 10;
    static private const OBJ_HEIGHT :int = 20;
    static private const RASEN_LENGTH :int = 1;
    static private const RASEN_RANGE :int = 500;
    static private const FOCUS_POS :int = 600;

    private var cylinder:Cylinder;
    private var loadSWF:Sprite;

    public function Main() {
    super(720, 480, true, true, CameraType.FREE);
    stage.scaleMode = StageScaleMode.NO_SCALE;
    stage.quality = StageQuality.HIGH;
    stage.frameRate = 60;
    viewport.containerSprite.buttonMode = true;
    init();
    }
    public function init():void {
    camera.focus = 600;
    camera.zoom = 1;
    camera.x = 0;
    camera.y = 0;
    camera.z = 0;

    for (var j:int = 0; j < OBJ_LENGTH; j++) {
    var rot:Number = 360 * (j / 10);
    loadSWF = new Sprite();
    loadSWF.graphics.beginFill(0xFFFFFF,0.6);
    loadSWF.graphics.drawRect(0, 0, 1000, 1000);
    loadSWF.graphics.drawRect(0, 0, 100, 100);
    loadSWF.graphics.endFill();
    var loader:Loader = new Loader();
    loadSWF.addChild(loader);
    loader.load(new URLRequest(“images/1.swf”));

    var material2:MovieMaterial = new MovieMaterial(loadSWF, true, true, true);
    material2.doubleSided = true;
    material2.smooth = true;
    material2.interactive = true;

    var o:Plane = new Plane(material2, 1000, 1000, 1, 1);
    o.x = CIRCLE_RANGE * Math.sin(rot * Math.PI / 180);
    //o.y = OBJ_HEIGHT * j – OBJ_HEIGHT * OBJ_LENGTH /2;
    o.z = CIRCLE_RANGE * Math.cos(rot * Math.PI / 180);
    o.rotationY = rot;
    scene.addChild(o);
    o.useOwnContainer = true;

    o.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, CLICK_HANDLER);
    o.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, CLICK_HANDLER);
    o.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, OVER_HANDLER);
    o.addEventListener(InteractiveScene3DEvent.OBJECT_OUT,OUT_HANDLER);

    }

    // Attributes
    var objRaduas :Number = 2797/2 / Math.PI / 2;
    var objHeight :int = 500/2;
    var quality :int = 32;

    var material:BitmapFileMaterial = new BitmapFileMaterial(“images/1.jpg”, false);
    material.doubleSided = true;
    material.smooth = true;

    cylinder = new Cylinder(material, objRaduas, objHeight, quality, quality, -1, false, false);
    scene.addChild(cylinder);

    camera.x = camera.y = camera.z = 0;
    camera.focus = 350;
    camera.zoom = 1;
    addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    startRendering();
    }

    private function CLICK_HANDLER(e:Event):void {
    trace(“CLICK_HANDLER”);
    }
    private function OVER_HANDLER(e:Event):void {
    trace(“OVER_HANDLER”);
    new Tween(e.target, “scale”, Elastic.easeOut, e.target.scale, 1.1, 20, false);
    }
    private function OUT_HANDLER(e:Event):void {
    trace(“OUT_HANDLER”);
    new Tween(e.target, “scale”, Elastic.easeOut, e.target.scale, 1, 20, false);
    }
    private function handleBitmapFileMaterialLoaded(e:FileLoadEvent):void {

    }
    private function handleBitmapFileMaterialError(e:FileLoadEvent):void {

    }
    private function enterFrameHandler(event:Event):void {

    var pan:Number = camera.rotationY – 210 * mouseX/(stage.stageWidth/2);
    pan = Math.max( -100, Math.min( pan, 100 ) ); // Max speed
    camera.rotationY -= pan / 12;

    if ( camera.y 210) {
    camera.y += ((mouseY / stage.stageHeight * 2000) – 1000 – camera.y) * .002;
    }

    if ( camera.y >= -18 && mouseY < 190) {
    camera.y += ((mouseY / stage.stageHeight * 2000) – 1000 – camera.y) * .002;
    }
    }
    }
    }
    ***********************************************************************************************

    何か間違ったことをしているでしょうか?それともflashの技術的限界なのでしょうか?
    教えていただけると幸いです。

  13. rect - 2009.02.28 23:13:51

    >cubeさん

    ここのコードとclockmakerさんのとこのコードの切り貼りなのは大いに結構ですが、ちゃんと租借した上で、もう少し整理したほうがいいと思いますよ。

    planeが表示されないとのことですが、単にカメラと近すぎなんじゃないですかね。
    カメラが2カ所で設定されてますが、これを一つにした上で

    camera.x = camera.y = camera.z = 0;
    camera.fov = 45;

    とかで。
    それと、forループ内で何度も同じ外部SWFを読み込んでマテリアル定義してますが、同じマテリアルを使うなら、定義は1回でいいんじゃないでしょうか。

    どういう動作をさせたいのかよくわかりませんが、試しに適当なものを作ってみた限りでは、flashの技術的限界などということはなさそうです。
    http://blog.r3c7.net/wp-content/uploads/materials/MovieMaterial/mmatTest.swf

  14. k2 - 2009.03.03 11:47:39

    rect様

    度々すみません。
    まわりにas3に精通した者がおりませんので是非rect様に教えていただきたいことがあります。
    planeに読み込むswfファイルとして
     http://lab.simplicit.co.za/previews/as3xmlscrollbarclass/preview.html
    にあるような、スクロールバー付きで外部xmlファイルをロードするものを使ってみたのですが、文字が表示されない、またスクロールバーが無効になるなどの問題に苦しんでいます。
    スクロールバーもボタンイベントと同じで、上でrect様が教えて下さった方法でできるだろうと予測していたのですが、そう簡単にはいきませんでした。
    何か別に設定する必要があるのでしょうか?

  15. rect - 2009.03.03 16:32:15

    >k2さん

    PV3D側で MovieMaterial に設定した MovieClip 側のイベントを有効にするための設定は、前回ご説明したとおりです。動かないのは as3xmlscrollbarclass 側の実装が、外部SWFとして読み込まれることを想定していないからです。

    具体的には、Scrollbar.asのイベントリスナー定義部分

    stage.addEventListener(MouseEvent.MOUSE_UP, releaseHandle);
    stage.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandle, true);

    ここで stage に対して addEventListener されていますが、外部読み込みしたSWFからのステージ参照は、それなりの対処が必要です。
    http://aquioux.blog48.fc2.com/blog-entry-252.html

    仮に
    this.addEventListener(MouseEvent.MOUSE_UP, releaseHandle);
    this.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandle, true);
    として、swfを書き出し直せば、とりあえずスクロールバーは動くと思います。
    ※MOUSE_UPを正常に動作させるには、stage参照を解決する必要があります。

    また、文字等が表示されないとのことですが、
    ・imagesフォルダ
    ・style.css
    ・scrollcontent.xml
    を、PV3D側のSWFと同じ階層に設置することで解消できるはずです。

    以下テスト結果
    http://blog.r3c7.net/wp-content/uploads/materials/MovieMaterial/mMat_interactiveTest.swf

    一応は動作しますが、ご覧の通りMovieMaterialはベクターをBitmap化しますので、文字などがキレイに出ません。

    k2さんがやろうとしていることがなんなのかわかりませんが、CS4が使えるのであれば、CS4の3D変形で十分だと思いますし、FlashPlayer9も動作対象に含めたいのであれば、ベクターの得意なFIVe3D(http://five3d.mathieu-badimon.com/)を使ったほうがいいように思います。

  16. k2 - 2009.03.03 19:47:15

    rect様

    いつも丁寧なご返答ありがとうございます。非常に助かっています。

    >k2さんがやろうとしていることがなんなのかわかりませんが

    複数のplaneにそれぞれ異なるswfファイルを読み込ませています。

    >※MOUSE_UPを正常に動作させるには、stage参照を解決する必要があります。

    すみませんがこのご注意の意味がよく分かりません。試しにrect様のアドバイスの通り”stage”の部分を”this”に変えてやってみたところスクロールバーは動いたものの、テキストフィールドの中身ではなく、テキストフィールドそのものがスクロールするようになったのですが、そういう意味のご注意でしょうか?

  17. rect - 2009.03.04 0:11:37

    >k2さん

    >テキストフィールドの中身ではなく、テキストフィールドそのものがスクロール

    それは、k2さんが今作られているものの元になった as3xmlscrollbarclass がそういう仕様だからです。テキストフィールドの中身をスクロールさせたいのであれば、TextField自身の scrollH、 scrollV パラメータを制御するように手を加える必要があります。

    >すみませんがこのご注意の意味がよく分かりません

    参考用にURLを提示した aquiouxさんのblogに書かれている通りです。外部読み込みしたSWFに対してドキュメントクラス(今k2さんが作られているもので言えば、PV3D側のクラス)から、as3xmlscrollbarclassに対して、stageへの参照を渡す必要があるということです。

    stageへの参照が無いと、
    stage.addEventListener(MouseEvent.MOUSE_UP, releaseHandle);
    などが機能せず、マウスアップしてもスクロールバーが止まらない状態になる、という注意です。

  18. k2 - 2009.03.11 16:54:12

    rect様

    質問しておいてお礼が大変おそくなってしまい、申し訳ございません。
    最近引っ越しをしまして、インターネットにつなげるのに時間がかかってしまいました。
    rect様のおかげで解決しました。

    ところで、今planeに外部xmlファイルを使ってflvファイルを呼び出して再生するmovie.swfというmovie playerを貼付けようとしているのですが、表示はしてくれるものの、どうもflvファイルを読み込めていないようなのですが、これは不可能なことなのでしょうか?
    教えていただけると幸いです。

  19. rect - 2009.03.12 0:35:34

    >k2さん

    >表示はしてくれるものの、どうもflvファイルを読み込めていない

    この手のトラブルは、外部読み込みする対象ファイルのディレクトリ階層に起因する場合が多いんじゃないでしょうか。
    http://pekeflash.atrock.main.jp/?eid=528741

    pv3dのマテリアルにする前に、flvを読み込んでいるswfを読み込んで、そのままステージにaddChildしたとき再生できるかどうかを検証してみてはいかがですか?

  20. k2 - 2009.03.12 11:21:13

    rect様

    >この手のトラブルは、外部読み込みする対象ファイルのディレクトリ階層に起因する場合が多いんじゃないでしょうか。

    cylinder上にplaneオブジェクト群を生成する親swfのある階層の一つ下の階層に、子swfとして次のページのdownload.zipのなかのindex.swfを準備して読み込ませようとしています。
     
     http://www.flashcomponents.net/component/light_xml_video_player_as_3.0/downloads.html

    私もおそらく問題は外部読み込みする対象ファイルのディレクトリ階層に起因すると考えていろいろためしてみたのですがなかなかうまくいきません。もしかしたら今の場合flvを読み込むことが本当に技術的に不可能なのかと思い次ぎのような実験をしてみました。

    planeを2枚用意し、一方には外部xmlファイルを利用したphoto galleryを貼付け、もう一方には外部xmlファイルを利用したmovie playerを貼付けます。xmlファイルに書かれているディレクトリ階層の指定は両方とも同じです。するとphoto galleryのほうはうまくjpgを読み込んで表示してくれるのに、movie playerのほうはうまくflvを読み込まないという状況です。

     

  21. rect - 2009.03.12 13:17:10

    >k2さん

    as3xmlscrollbarclass のケースと同様でしょう。
    本来外部読み込みされることを前提として作られていないわけですから、それに合わせて Light XML Video player に手を入れる(stageへの参照など)必要があります。

    また、デフォルト状態の「play_list.xml」のパス指定だと、Light XML Video playerのアーカイブ内にある「loadingフォルダ」は、pv3dを使用している親swfと同じ階層に設置する必要があります。

    適当に試した限りでは、仕様的に不可能なわけではなさそうですね。
    http://blog.r3c7.net/wp-content/uploads/materials/MovieMaterial/moviematerial_flv.swf

  22. k2 - 2009.03.12 18:14:40

    rect様

    すごい!
    ちゃんと読み込んでますね。

    >また、デフォルト状態の「play_list.xml」のパス指定だと、Light XML Video playerのアーカイブ内にある「loadingフォルダ」は、pv3dを使用している親swfと同じ階層に設置する必要があります。

    これは正しく設定できています。

    >Light XML Video player に手を入れる(stageへの参照など)必要があります。
    具体的にはどうすればいいのでしょうか?
    どうもstage参照はよく分かりません。
    stage.addEventListnerを全てthis.addEventListnerに変えればいいんでしょうか?

  23. rect - 2009.03.13 12:45:28

    >k2さん

    ・ステージに配置されているplayer_mcのx,y座標を(0,0)に

    ・ステージのタイムラインスクリプト
     var currentW:Number = 437.2;
     を残して他をコメントアウトまたは削除

    ・player_mc.video_holder_mc のタイムラインスクリプト
     stage.mouseChildren = true;
     stage.mouseChildren = false;
     を、
     parent.parent.mouseChildren = true;
     parent.parent.mouseChildren = false;
     に書き換え

    以上でとりあえずは動きます。
    ただ動くというだけでこれが正解ではないと思いますので、一切の保証はできません。

    >具体的にはどうすればいいのでしょうか?
    >どうもstage参照はよく分かりません。

    解るまでのたうち回っていないからです。
    拾ってきたコードをツギハギすること自体は否定しませんが、中身をちゃんと読み解いて、何をどうやって実現しているかを理解しないまま、ひたすらコードを混ぜることに奔走していても何の勉強にもなりません。基礎から積み上げるのが一番ですが、せめて応用されたものから基礎を紐解くくらいの労力をかけるのが、コードを流用する上で最低限のマナーですよ。

Leave a Reply