flash on 2011-5-24
♥0 |
Line 94 |
Modified 2011-05-25 10:46:06 |
MIT License
archived:2017-03-30 03:04:40
ActionScript3 source code
/**
* Copyright tepe ( http://wonderfl.net/user/tepe )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/rEIC
*/
package {
import flash.events.*;
import flash.filters.*;
import flash.utils.*;
import flash.net.*;
import flash.display.*;
import flash.events.Event;
import flash.utils.ByteArray;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.view.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.MaterialsList;
import mx.utils.Base64Decoder;
import org.papervision3d.core.effects.view.*;
import org.papervision3d.lights.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.objects.primitives.*;
public class Reflect extends ReflectionView {
// 画像を BASE64 エンコードしたもの
private static var ImageBase64:String = "R0lGODlhEAAQAJkAAOdfEwAAAPDQsAAAACH5BAAAAAAALAAAAAAQABAAAAI2hI4XhgYPXxBxxkqhvTJ33i0fuATm4l1TsnEt8GIymZ5uCiviqFG6ictBEDGhCmeCnZKCZbIAADs=";
private var cube:Cube;
private var field:Plane;
private var mat01:BitmapMaterial;
private function loadComplete(bmd:BitmapData):void{
var block:Cube;
// 表示するテクスチャを右上に表示
//addChild(new Bitmap(bmd));
// BitmapMaterial に BitmapData を渡す
mat01 = new BitmapMaterial(bmd, true);
// tiled を true に、maxU, maxV に敷き詰める数を渡す
mat01.tiled = true;
mat01.maxU = 1;
mat01.maxV = 1;
// Cube の面に貼り付ける
cube = new Cube(new MaterialsList({all:mat01}));
scene.addChild(cube);
//setCube(1,0,0);
//setCube(1,1,0);
//setCube(1,2,1);
for(var i:int = 0;i<3;i++){
for(var j:int =0;j<3;j++){
for(var k:int =0;k<3;k++){
//setCube(i,j,k);
}
}
}
// 描画を開始する
startRendering();
}
private function setCube(x:int,y:int,z:int):void{
// Cube の面に貼り付ける
cube = new Cube(new MaterialsList({all:mat01}));
cube.x = x*500;
cube.y = y*500;
cube.z = z*500;
scene.addChild(cube);
}
private function base64ToBitmapData(base64:String, callback:Function):void{
var decoder:Base64Decoder = new Base64Decoder();
decoder.decode(base64);
var bytes:ByteArray = decoder.toByteArray();
bytes.position = 0;
var loader:Loader = new Loader();
loader.loadBytes(bytes);
var bmd:BitmapData = new BitmapData(16, 16);
loader.contentLoaderInfo.addEventListener("complete", function(event:Event):void{
var bmd:BitmapData = new BitmapData(loader.width, loader.height);
bmd.draw(loader);
callback(bmd);
});
}
public function Reflect():void {
//背景色
graphics.beginFill(0x000000);
graphics.drawRect(0, 0, 465, 465);
graphics.endFill();
// マテリアルを作成
//var material:FlatShadeMaterial = new FlatShadeMaterial(new PointLight3D(), 0x2288CC, 0x004466);
//var materials:MaterialsList = new MaterialsList( { all:material } );
base64ToBitmapData(ImageBase64, loadComplete);
//モデル生成
field = createEarth();
//cube = new Cube(materials);
//scene.addChild(cube);
scene.addChild(field);
//scene.removeChild(field);
// 反射を設定
//surfaceHeight = -600; // 反射面の座標
//viewportReflection.filters = [new BlurFilter(10, 5, 5)]; // 反射面のフィルタ
//viewportReflection.alpha = 0.7; // 反射面の透明度
addEventListener(Event.ENTER_FRAME, loop);
}
private function createEarth():Plane {
var earth:Plane = new Plane(new WireframeMaterial(0x00ff00, 0.5), 6000, 6000, 10, 10);
with (earth) {
rotationX = 90;
//rotationY = 20;
scaleX = scaleY = 1;
y = -3000;
}
return earth;
}
private var sw:Boolean;
// エンターフレームイベントを登録
private function loop(e:Event):void {
// モーション
//cube.rotationY += 2;
//camera.x += 20;
camera.y = 500 + 2000 * Math.sin(getTimer() / 1000);
if(Math.sin(getTimer() / 1000) > 0 && sw == true){
scene.addChild(cube);
sw = false;
}
else if(Math.sin(getTimer() / 1000) < 0 && sw == false){
scene.removeChild(cube);
sw = true;
}
// レンダリング
singleRender();
}
}
}