3D를 이용하면 360도로 촬영한 영상을 구체(Sphere)에 담아서 실시간으로 돌려볼 수 있습니다.
Adobe AIR 17부터 지원하는 VideoTexture를 이용하면 AIR에서도 60프레임으로 플레이가 가능합니다.

구글 카드보드를 위한 분할 화면 ::

VideoTexture 사용 예제 (with Flare3D) ::

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
package  {
    import flare.basic.*;
    import flare.core.*;
    import flare.materials.*;
    import flare.materials.filters.*;
    import flare.primitives.*;
    import flash.display.*;
    import flash.events.*;
    import flash.media.*;
    import flash.net.*;
   
    /**
     * This example needs to be compiled for AIR, it won't work on Flash Player.
     * @author Ariel Nehmad
     */

    public class Test73_VideoTexture extends Sprite
    {
        private var scene:Scene3D;
        private var videoTexture:Texture3D;
        private var netStream:NetStream;
        private var cube:Cube;
        private var material:Shader3D;
       
        public function Test73_VideoTexture()
        {
            scene = new Viewer3D(this, "", 0.2);
            scene.camera.setPosition(10, 20, -30);
            scene.camera.lookAt(0, 0, 0);
           
            var nc:NetConnection = new NetConnection();
            nc.connect(null);
           
            netStream = new NetStream(nc);
            netStream.client = { };
           
            videoTexture = new Texture3D(netStream);
            videoTexture.addEventListener("upload", textureUploadEvent);
            videoTexture.upload(scene);
           
            material = new Shader3D("video", [new TextureMapFilter(videoTexture)])
           
            cube = new Cube("cube", 10, 10, 10, 1)
            cube.parent = scene;
        }
       
        private function textureUploadEvent(e:Event):void
        {
            netStream.play("http://www.flare3d.com/demos/big_buck_bunny_trailer_480p_baseline.mp4");
           
            videoTexture.removeEventListener("upload", textureUploadEvent);
            videoTexture.texture.addEventListener(VideoTextureEvent.RENDER_STATE, renderState);
        }
       
        private function renderState(e:VideoTextureEvent):void
        {
            videoTexture.texture.removeEventListener(VideoTextureEvent.RENDER_STATE, renderState);
           
            trace(e.status);
           
            if ( e.status == VideoStatus.SOFTWARE) {
                // Indicates software video decoding works.
                cube.setMaterial(material);
            }
            else if ( e.status == VideoStatus.ACCELERATED ) {
                // Indicates hardware-accelerated (GPU) video decoding works.
                cube.setMaterial(material);
            }
            else if ( e.status == VideoStatus.UNAVAILABLE ) {
                // Indicates Video decoding is not supported.
            }          
        }
    }
}