Forked from: daijimachine's Dobuemon Tunnel diff:1 forked from: Dobuemon Tunnel Bahwan.Han forked:0favorite:0lines:158license : MIT License modified : 2011-09-20 10:06:26 Embed Tweet // forked from daijimachine's Dobuemon Tunnel /** * Dobuemon Tunnel * * AAway3D4.0の開発が絶賛進んでるけど、 * FlashPlayer10対応のAway3D3.6を一足遅れていじってみた。 * * 日本有数の心霊スポット、その名はドブえもんトンネル。 * ずーーーっと見てると気分を悪くする場合がありますので * くれぐれもご注意ください。 * 当方では責任を負いかねます。 * * @author Masayuki Daijima (ARCHETYP Inc.) * http://www.daijima.jp/ * http://twitter.com/daijimachine */ package { import away3d.cameras.Camera3D; import away3d.containers.Scene3D; import away3d.containers.View3D; import away3d.core.base.Vertex; import away3d.core.filter.FogFilter; import away3d.core.render.BasicRenderer; import away3d.materials.ColorMaterial; import away3d.materials.TransformBitmapMaterial; import away3d.primitives.Cylinder; import com.bit101.components.ProgressBar; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.system.Security; import flash.events.Event; import flash.events.ProgressEvent; import flash.geom.Matrix3D; import flash.geom.Vector3D; import flash.net.URLRequest; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.easing.Quad; import org.libspark.betweenas3.tweens.ITween; [SWF(backgroundColor = "#000000", frameRate = "50", width = "465", height = "465")] public class Document extends Sprite { private const IMG_URL:String = "http://www.daijima.jp/materials/wonderfl/dobuemon/images/twitter_icon_bigger.jpg"; private const D2R:Number = Math.PI / 180; private var _loadPercent:Number = 0; private var _dobuemon:Loader; private var _scene:Scene3D; private var _camera:Camera3D; private var _view:View3D; private var _cylinder:Cylinder; private var _cylinder2:Cylinder; private var _bitmapMaterial:TransformBitmapMaterial; private var _weights:Array; private var _angle:int; private var _mtx1:Matrix3D; private var _mtx2:Matrix3D; private var _vec:Vector3D; public function Document() { Security.loadPolicyFile("http://www.daijima.jp/crossdomain.xml"); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.quality = StageQuality.LOW; loadDobuemon(); } private function loadDobuemon():void { _dobuemon = new Loader(); var req:URLRequest = new URLRequest(IMG_URL); _dobuemon.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress); _dobuemon.load(req); setProgressBar(); } private function loadProgress(event:ProgressEvent):void { _loadPercent = event.target.bytesLoaded / event.target.bytesTotal; } private function setProgressBar():void { var p_bar:ProgressBar = new ProgressBar(this, 182, 232); addEventListener(Event.ENTER_FRAME, function(event:Event):void { p_bar.value += (_loadPercent - p_bar.value) * .5; if (p_bar.value > .99) { p_bar.value = 1; event.target.removeEventListener(event.type, arguments.callee); var _tw:ITween = BetweenAS3.serial( BetweenAS3.to(p_bar, { alpha:0 }, .3, Quad.easeOut), BetweenAS3.removeFromParent(p_bar) ); _tw.onComplete = setWorld; _tw.play(); } }); } private function setWorld():void { _dobuemon.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, loadProgress); _mtx1 = new Matrix3D(); _mtx2 = new Matrix3D(); _vec = new Vector3D(); _weights = []; _angle = 0; _scene = new Scene3D(); _camera = new Camera3D(); _camera.y = -500; _camera.x = 0; _camera.z = 0; _camera.focus = 25; _camera.zoom = 25; _camera.rotationX = 90; var filter:FogFilter = new FogFilter( { material:new ColorMaterial(0), minZ:100, maxZ:1500 } ); _view = new View3D( { camera: _camera, scene: _scene, stats: false, x: stage.stageWidth >> 1, y: stage.stageHeight >> 1 } ); _view.renderer = new BasicRenderer(filter); addChild(_view); var bmpd:BitmapData = Bitmap(_dobuemon.content).bitmapData; _bitmapMaterial = new TransformBitmapMaterial(bmpd, { repeat:true, scaleX:.1, scaleY:.1 } ); var radius:int = 120; var segment:int = 10; var h:int = 1000; _cylinder = new Cylinder( { material:_bitmapMaterial, radius:radius, segmentsW:segment, segmentsH:segment, height:h, openEnded:true } ); _cylinder2 = new Cylinder( { material:_bitmapMaterial, radius:radius, segmentsW:segment, segmentsH:segment, height:h, openEnded:true } ); _cylinder.bothsides = true; _scene.addChild(_cylinder); var weight:Number, i:int; for each(var v:Vertex in _cylinder.vertices) { var row:int = i / segment; weight = row * 0.000625; _weights.push(weight); i++; } onStageResize(); stage.addEventListener(Event.RESIZE, onStageResize); addEventListener(Event.ENTER_FRAME, update); } private function update(event:Event):void { _bitmapMaterial.offsetY++; _cylinder.rotationY += 0.5; _angle++; var rad:Number = _angle * D2R; var updateNum:Number = Math.cos(rad) * 0.00045; var i:int = 0; while(i < _cylinder2.vertices.length) { var v1:Vertex = _cylinder.vertices[i]; var v2:Vertex = _cylinder2.vertices[i]; _mtx1.identity(); _mtx1.prependRotation(updateNum, new Vector3D(0, 0, 1)); _mtx2.prependTranslation(updateNum, 0, 0); _mtx1.prepend(_mtx2); _vec = _mtx1.transformVector(v2.position); v2.x = _vec.x; v2.y = _vec.y; v2.z = _vec.z; var weightedV:Vertex = Vertex.weighted(v1, v2, 1 - _weights[i], _weights[i]); v1.x = weightedV.x; v1.y = weightedV.y; v1.z = weightedV.z; i++; } _view.render(); } private function onStageResize(event:Event = null):void { _view.x = stage.stageWidth >> 1; _view.y = stage.stageHeight >> 1; } } } Code Fullscreen Preview Fullscreen