Flashhilfe.de - Flash Community

Reflektion bei Videos in Papervision3D [Flash 9]

 


AntwortenRegistrieren Seite1  

Atticus#1
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

16.03.2009, 16:22

Hallo^^

In diesem Beitrag hat badskill und niquito12 mir geholfen Videos in Papervision3D zu laden und zu Steuern :) Und nun kommt der nächste Schritt, nämlich die Reflektion der Videos :)

Bisher habe ich bei Bilder Gallerien mit Papervison3D mit diesem Script:

ActionScript:
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
if(reflection == true) {
      plane.extra.reflection = new Plane();

      var bitmapDataReflection:BitmapData = new BitmapData(loadedObject.width, loadedObject.height, true, 0x000000);

      var matrix:Matrix = new Matrix();
      matrix.createBox(1, -1, 0, 0, loadedObject.height);
      bitmapDataReflection.draw(bmpData, matrix);

      var b2:Bitmap = new Bitmap(bitmapDataReflection);

      matrix.createGradientBox(loadedObject.width, loadedObject.height, Math.PI/2, loadedObject.height);
      var mymask:Shape = new Shape();
      mymask.graphics.lineStyle(0,0,0);
      mymask.graphics.beginGradientFill("linear", [0x000000, 0x000000], [reflectionintensity1, reflectionintensity2], [reflectiondensity1, reflectiondensity2], matrix) ;
      mymask.graphics.lineTo(0, loadedObject.height);
      mymask.graphics.lineTo(loadedObject.width, loadedObject.height);
      mymask.graphics.lineTo(loadedObject.width, 0);
      mymask.graphics.lineTo(0, 0);
      mymask.graphics.endFill();

      mymask.cacheAsBitmap = true;
      b2.cacheAsBitmap = true;

      b2.mask = mymask;

      addChild(b2);
      
      addChild(mymask);

      var bmp3:BitmapData = new BitmapData(loadedObject.width, loadedObject.height, true, 0x000000);
      bmp3.draw(b2);

      var bm2:BitmapMaterial = new BitmapMaterial(bmp3);
      bm2.precise = true;
      bm2.doubleSided = reflectionDoubleSide;
      bm2.smooth = reflectionSmooth;
      var p2:Plane = new Plane(bm2, 1, 0, 1, 1);
      
      plane.extra.reflection = p2;
      
      plane.extra.reflection.useOwnContainer = true;
   
      if(imageshadow == true) {
         if(reflectionshadow == true) {
             plane.extra.reflection.filters = [new DropShadowFilter(0, 45, imageshadowcolor, 1, 8, 8, 3, 1)];
         }
      }
   
      scene.addChild(p2, "reflection" + index);
      
      removeChild(b2);
      
      removeChild(mymask);
      
      if(reflection == true) {
         plane.extra.reflection.x = plane.x;
         plane.extra.reflection.y = -reflectdistance + plane.y;
       }
      
      else {
         scene.removeChild(plane.extra.reflection);
      }
   }


Reflektionen erstellt was auch immer Prima funktioniert hat. Leider geht dieses Script jetzt nicht mehr bei den Videos da es sich ja nicht mehr um Grafiken also Bitmaps handelt.

Es wäre super wenn mir jemand jetzt sagen könnte wie ich von VideostreamMaterials Reflektionen erstellen kann und was ich an diesem Script ändern muß damit es auch bei den Videos funktioniert :)

Vielen Dank schonmal im vorraus !!!

Gruß Atticus^^
Geändert von Atticus am 16.03.09 um 16:28 Uhr
marianG#2
Benutzerbild von marianG
Beiträge: 154
Registriert: Jun 2005

16.03.2009, 22:35

hi,

du musst das hier updaten:
ActionScript:
1bitmapDataReflection.draw(bmpData, matrix);
Atticus#3
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

16.03.2009, 22:53

Hi marianG^^

Vielen Dank erstmal, aber glaubst du das ist richtig???

Ich muß jetzt Planes mit einem VideoStreamMaterial Reflektieren.

Gruß Atticus^^
marianG#4
Benutzerbild von marianG
Beiträge: 154
Registriert: Jun 2005

17.03.2009, 01:03

Ja, du musst die Reflection in einer onEnterFrame updaten!
Ich würde einfach eine update Funktion schreiben. Das BitmapData und die Matrix würde ich nicht jedesmal neu schreiben (mehr speed).
Das MovieMaterial von der Reflection muss auf animated true stehen - das wars!

Gruß,
Marian
Atticus#5
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

19.03.2009, 01:33

Hi^^

Erstmal vielen Dank!!! Mein Problem ist aber das ich immer eine Fehlermeldung bekomme:

ActionScript:
11120: Zugriff auf eine nicht definierte Eigenschaft bmpData.


Weist du woran das liegt ???

Vielen Dank!!!

Gruß Atticus^^
springer#6
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

19.03.2009, 08:11

hi, du greifst da auf etwas zu, das nicht da ist...

wie sieht denn deine funktion zum updaten der reflektion aus?
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Atticus#7
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

19.03.2009, 15:22

Hallo springer^^

Ich habe gestern noch davor gessesen und im Moment sieht es bei mir so aus:

ActionScript:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import flash.display.*;
import flash.events.*;
import flash.geom.Matrix;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.text.*;
import flash.utils.Dictionary;
import flash.events.Event;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.display.BitmapData;
import flash.display.GradientType;
import flash.display.Sprite;
import flash.events.NetStatusEvent;
import flash.filters.BlurFilter;
import flash.geom.Matrix;

import org.papervision3d.cameras.*;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.scenes.*;
import org.papervision3d.view.*;
import org.papervision3d.render.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.materials.*;
import org.papervision3d.events.*;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.VideoStreamMaterial;
import org.papervision3d.objects.primitives.Plane;
   
var viewport:Viewport3D;
var scene:Scene3D = new Scene3D();
var camera:Camera3D = new Camera3D();
var renderer:BasicRenderEngine = new BasicRenderEngine();

var cameraZoom:Number = 1.5;
var cameraFocus:Number = 500;

var customClient:Object = new Object();
var netConnection:NetConnection;
var video:Video;
var netStream:NetStream;
var videoStreamMaterial:VideoStreamMaterial;

var streamsAndPlanes:Dictionary = new Dictionary(true);

function create3DScene() {
   Initial3D();

   create3DData();
};

function Initial3D():void {
   stage.align = StageAlign.TOP_LEFT;
   stage.scaleMode = StageScaleMode.NO_SCALE;

   viewport = new Viewport3D(stage.stageWidth, stage.stageHeight, true, true);
   viewport.visible = true;
   addChild(viewport);
   
   camera.zoom = cameraZoom;
   
   camera.focus = cameraFocus;
};

function create3DData():void {
   for(var i:uint = 0; i < 3; i++) {
      customClient.onMetaData = metaDataHandler;
   
      netConnection = new NetConnection();
      netConnection.connect(null);

      netStream = new NetStream(netConnection);
      netStream.client = customClient;
      netStream.play("flvvideo0" + (i + 1) + ".mov");
      netStream.seek(0);
      netStream.pause();
   
      video = new Video();
      video.smoothing = true;
      video.attachNetStream(netStream);

      var videoStreamMaterial = new VideoStreamMaterial(video, netStream);

      videoStreamMaterial.interactive = true;
      videoStreamMaterial.animated = true;
      
      var plane = new Plane(videoStreamMaterial, video.width, video.height, 8, 8);
   
      plane.rotationX = 0;
   
      plane.x = i * 500;
   
      streamsAndPlanes[netStream] = plane;
   
      scene.addChild(plane);
      
      var bm = new BitmapMaterial(new BitmapData(video.width, video.height), true);
        bm.doubleSided = true;

        var reflectionPlane = new Plane(bm, video.width, video.height);
        reflectionPlane.rotationX = 180;
        reflectionPlane.y = -video.height;
      reflectionPlane.x = i * 500;
         
        scene.addChild(reflectionPlane);

        var matrix = new Matrix();
        matrix.createGradientBox(video.width, video.height, (90/180)*Math.PI, 0, 90);

        var gradientMask = new Sprite();
        gradientMask.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFFF], [1, 0.4], [0, 255], matrix);
        gradientMask.graphics.drawRect(0, 0, video.width, video.height);
        gradientMask.graphics.endFill();
        gradientMask.cacheAsBitmap = true
      
      bm.bitmap.draw(plane.material.bitmap);
        bm.bitmap.draw(gradientMask);
 
      plane.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, onPlaneRelease, false, 0, true);
      
      VideoStreamMaterial(plane.material).stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   }
};
      
function onPlaneRelease(e:InteractiveScene3DEvent):void {
   var plane:Plane = e.target as Plane;

   VideoStreamMaterial(plane.material).stream.resume();
};

function netStatusHandler(e:NetStatusEvent):void {
   switch(e.info.code) {
       case "NetConnection.Connect.Success":
           trace("successfully connected");

           break;

        case "NetStream.Play.StreamNotFound":
            trace("Unable to locate video: ");

            break;

        case "NetStream.Buffer.Full":
            trace("buffer full");

            break;

        case "NetStream.Buffer.Empty":
            trace("buffer empty");

            break;

        case "NetStream.Play.Stop":
            test.text = "video stop";
         
         var stream:NetStream = e.target as NetStream;
         var plane:Plane = streamsAndPlanes[stream];
         
         stream.seek(0);
         stream.pause();

         VideoStreamMaterial(plane.material).animated = true;

             break;
   }
};

function metaDataHandler(infoObject:Object):void {
   trace(infoObject);
};

addEventListener(Event.ENTER_FRAME, update3D);

function update3D(e:Event):void {
   renderer.renderScene(scene, camera, viewport);
};

create3DScene();


Die Reflektion wird so auch angezeigt, allerdings ohne den Inhalt. Ich glaube ich muß das hier Updaten:

ActionScript:
1
2
bm.bitmap.draw(plane.material.bitmap);
        bm.bitmap.draw(gradientMask);


Weis jemand vielleicht wie ich das anstellen muß damit das Richtig funktioniert ???

Gruß Atticus^^
Atticus#8
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

21.03.2009, 01:04

Hallo^^

Ich bin jetzt schonmal einen riesen Schritt weiter :) Mein Script sieht jetzt so aus:

ActionScript:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import flash.display.*;
import flash.events.*;
import flash.geom.Matrix;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.text.*;
import flash.utils.Dictionary;
import flash.events.Event;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.display.BitmapData;
import flash.display.GradientType;
import flash.display.Sprite;
import flash.events.NetStatusEvent;
import flash.filters.BlurFilter;
import flash.geom.Matrix;

import org.papervision3d.cameras.*;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.scenes.*;
import org.papervision3d.view.*;
import org.papervision3d.render.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.materials.*;
import org.papervision3d.events.*;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.VideoStreamMaterial;
import org.papervision3d.objects.primitives.Plane;
   
var viewport:Viewport3D;
var scene:Scene3D = new Scene3D();
var camera:Camera3D = new Camera3D();
var renderer:BasicRenderEngine = new BasicRenderEngine();

var cameraZoom:Number = 1.5;
var cameraFocus:Number = 500;

var customClient:Object = new Object();
var netConnection:NetConnection;
var video:Video;
var netStream:NetStream;
var videoStreamMaterial:VideoStreamMaterial;

var plane;
var bm:BitmapMaterial;
var matrix:Matrix;
var gradientMask:Sprite
      
var streamsAndPlanes:Dictionary = new Dictionary(true);

function create3DScene() {
   Initial3D();

   create3DData();
};

function Initial3D():void {
   stage.align = StageAlign.TOP_LEFT;
   stage.scaleMode = StageScaleMode.NO_SCALE;

   viewport = new Viewport3D(stage.stageWidth, stage.stageHeight, true, true);
   viewport.visible = true;
   
   addChild(viewport);
   
   camera.zoom = cameraZoom;
   
   camera.focus = cameraFocus;
};

function create3DData():void {
   for(var i:uint = 0; i < 3; i++) {
      customClient.onMetaData = metaDataHandler;
   
      netConnection = new NetConnection();
      netConnection.connect(null);

      netStream = new NetStream(netConnection);
      netStream.client = customClient;
      netStream.play("flvvideo0" + (i + 1) + ".mov");
      netStream.seek(0);
      netStream.pause();
   
      video = new Video();
      video.smoothing = true;
      video.attachNetStream(netStream);

      var videoStreamMaterial = new VideoStreamMaterial(video, netStream);

      videoStreamMaterial.interactive = true;
      videoStreamMaterial.animated = true;
      
      plane = new Plane(videoStreamMaterial, video.width, video.height, 8, 8);
   
      plane.rotationX = 0;
   
      plane.x = i * 500;
   
      streamsAndPlanes[netStream] = plane;
   
      scene.addChild(plane);
      
      bm = new BitmapMaterial(new BitmapData(video.width, video.height), true);
        bm.doubleSided = true;

        var reflectionPlane = new Plane(bm, video.width, video.height);
        reflectionPlane.rotationX = 180;
        reflectionPlane.y = -video.height;
      reflectionPlane.x = i * 500;
         
        scene.addChild(reflectionPlane);

        matrix = new Matrix();
        matrix.createGradientBox(video.width, video.height, (90/180)*Math.PI, 0, 90);

        gradientMask = new Sprite();
        gradientMask.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFFF], [1, 0.4], [0, 255], matrix);
        gradientMask.graphics.drawRect(0, 0, video.width, video.height);
        gradientMask.graphics.endFill();
        gradientMask.cacheAsBitmap = true
      
      plane.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, onPlaneRelease, false, 0, true);
      
      VideoStreamMaterial(plane.material).stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   }
};
      
addEventListener(Event.ENTER_FRAME, onEnterFrame);


function onEnterFrame(e:Event):void {
   bm.bitmap.draw(plane.material.bitmap);
    bm.bitmap.draw(gradientMask);
};


function onPlaneRelease(e:InteractiveScene3DEvent):void {
   var plane:Plane = e.target as Plane;
         
   VideoStreamMaterial(plane.material).stream.resume();
};

function netStatusHandler(e:NetStatusEvent):void {
   switch(e.info.code) {
       case "NetConnection.Connect.Success":
           trace("successfully connected");

           break;

        case "NetStream.Play.StreamNotFound":
            trace("Unable to locate video: ");

            break;

        case "NetStream.Buffer.Full":
            trace("buffer full");

            break;

        case "NetStream.Buffer.Empty":
            trace("buffer empty");

            break;

        case "NetStream.Play.Stop":
            test.text = "video stop";
         
         var stream:NetStream = e.target as NetStream;
         var plane:Plane = streamsAndPlanes[stream];
         
         stream.seek(0);
         stream.pause();

         VideoStreamMaterial(plane.material).animated = true;
         
             break;
   }
};

function metaDataHandler(infoObject:Object):void {
   trace(infoObject);
};

addEventListener(Event.ENTER_FRAME, update3D);

function update3D(e:Event):void {
   renderer.renderScene(scene, camera, viewport);
};

create3DScene();


Die Reflektion wird angezeigt und auch abgespielt :) Allerdings nur wenn man nur ein Video auf der Bühne erstellt. Sobald man mehrere Planes erstellt mit einem Video hat nur das zuletzt erstellte Video auch die Reflektion.

Es wäre super wenn mir jemand sagen könnte was ich hier noch falsch mache !!!

Vielen Dank !!!

Gruß Atticus^^
springer#9
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

21.03.2009, 15:07

hi,
du zeichnest ja nur einmal neu

ActionScript:
1
2
3
4
function onEnterFrame(e:Event):void {
  bm.bitmap.draw(plane.material.bitmap);
    bm.bitmap.draw(gradientMask);
};


das problem liegt im gültigkeitsbereich deiner referenzen plane,bm
du hast je eine referenz für bm und plane.
planes und bm's hast du aber drei...

planes und bitmaps in arrays pushen. dann noch die "onEnterFrame" ein wenig anpassen mit einer schleife zb:

ActionScript:
1
2
BitmapMaterial(this.deineBitmaps[i]).bitmap.draw(Plane(this.deinePlanes[i]).material.bitmap);
BitmapMaterial(this.deineBitmaps[i]).bitmap.draw(gradientMask);


dann hast du deine drei spiegelungen ;-)

grüsse
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Atticus#10
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

21.03.2009, 17:34

Super, danke !!!

Ich probiere das später mal aus und bei Problemen melde ich mich nochmal :)

Gruß Atticus^^
Atticus#11
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

22.03.2009, 17:34

Hi springer^^

Ich habe es hinbekommen ;) Hier ist die Lösung:

ActionScript:
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
function create3DData():void {
   for(var i:uint = 0; i < 2; i++) {
      customClient.onMetaData = metaDataHandler;
   
      netConnection = new NetConnection();
      netConnection.connect(null);

      netStream = new NetStream(netConnection);
      netStream.client = customClient;
      netStream.play("flvvideo0" + (i + 1) + ".mov");
      netStream.seek(0);
      netStream.pause();
   
      video = new Video();
      video.smoothing = true;
      video.attachNetStream(netStream);

      var videoStreamMaterial = new VideoStreamMaterial(video, netStream);

      videoStreamMaterial.interactive = true;
      videoStreamMaterial.animated = true;
      
      plane = new Plane(videoStreamMaterial, video.width, video.height, 8, 8);
   
      plane.rotationX = 0;
   
      plane.x = i * 500;
   
      streamsAndPlanes[netStream] = plane;
   
      scene.addChild(plane);
      
      planeArray.push(plane);
      
      bm = new BitmapMaterial(new BitmapData(video.width, video.height), true);
        bm.doubleSided = true;

      bitmapArray.push(bm);
      
        reflectionPlane = new Plane(bm, video.width, video.height);
        reflectionPlane.rotationX = 180;
        reflectionPlane.y = -video.height;
      reflectionPlane.x = i * 500;
         
        scene.addChild(reflectionPlane);

        matrix = new Matrix();
        matrix.createGradientBox(video.width, video.height, (90/180)*Math.PI, 0, 90);

        gradientMask = new Sprite();
        gradientMask.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFFF], [1, 0.4], [0, 255], matrix);
        gradientMask.graphics.drawRect(0, 0, video.width, video.height);
        gradientMask.graphics.endFill();
        gradientMask.cacheAsBitmap = true
      
      plane.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, onPlaneRelease, false, 0, true);
      
      VideoStreamMaterial(plane.material).stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   }
};
      
addEventListener(Event.ENTER_FRAME, onEnterFrame);


function onEnterFrame(e:Event):void {
   for(var i = 0; i < planeArray.length; i++) {
      bitmapArray[i].bitmap.draw(planeArray[i].material.bitmap);
       bitmapArray[i].bitmap.draw(gradientMask);
   }
};


Vielen Dank nochmal !!!

Gruß Atticus^^

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2021 Sebastian Wichmann - Flashhilfe.de