/**
* Copyright bradsedito ( http://wonderfl.net/user/bradsedito )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/6RDt
*/
// forked from ashtail's forked from: study
// forked from ashtail's study
/*
* clockmakerさんのコードを映しながら勉強
*/
package {
import flash.events.Event;
import flash.display.*;
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.system.Security;
import flash.utils.getTimer;
import org.papervision3d.view.BasicView;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.primitives.*;
import flash.geom.Matrix;
import org.papervision3d.objects.special.ParticleField;
import org.papervision3d.materials.special.ParticleMaterial;
public class Main extends BasicView {
// Plane(material:MaterialObject3D = null, width:Number = 0, height:Number = 0, segmentsW:Number = 0, segmentsH:Number = 0)
private var earth:Plane = new Plane(new WireframeMaterial(0xFFFFFF, 0.1), 5000, 5000, 6, 6);
private var _loader:Loader = new Loader();
private var _player:Object = new Object();
public function Main() {
Security.allowDomain("www.youtube.com");
_loader.contentLoaderInfo.addEventListener(Event.INIT, _loadInitHandler);
_loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));
// BasicViewクラスはカメラやViewPortといった,描画でかならず必要となるクラスをまとめて宣言してくれる。
// (viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
super(465, 465, false);
stage.quality = StageQuality.LOW;
// 背景
var w:int=465;
var h:int=465;
//線状のグラデーション
var type:String = GradientType.LINEAR;
var colors:Array=[0x666666,0x000000];
var alphas:Array=[1, 1];
var ratios:Array=[0,255];
var mtrx:Matrix = new Matrix();
mtrx.createGradientBox(w,h,0,0,0);
//グラデーションを45度回転する
mtrx.rotate(Math.PI/2);
var spread:String=SpreadMethod.PAD;
var interpolation:String="rgb";
var focalPointRatio:Number=0;
//グラデーションで塗る
graphics.beginGradientFill(type,colors,alphas,ratios,mtrx,spread,interpolation,focalPointRatio);
//四角形を描く
graphics.drawRect(0,0,w,h);
graphics.endFill();
// 3Dのパーツを配置
earth.y = -1000;
earth.rotationX = 90;
earth.rotationY = 45;
scene.addChild(earth);
// パーティクルを生成します(彗星)
// ParticleMaterial(color:Number, alpha:Number, shape:int = 0)
var particleMat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 1);
// ParticleField クラスは指定された 3D 領域上にランダムに沢山のパーティクルを描写するクラスです。
// ParticleField(mat:ParticleMaterial, quantity:int = 200, particleSize:Number = 4, fieldWidth:Number = 2000, fieldHeight:Number = 2000, fieldDepth:Number = 2000)
var particles:ParticleField = new ParticleField(particleMat, 500, 4, 5000, 3000, 5000)
scene.addChild( particles );
// エンターフレームイベントの登録
addEventListener(Event.ENTER_FRAME, _enterFrameHandler2);
}
private function _loadInitHandler(e:Event):void{
addChild(_loader);
_loader.content.addEventListener("onReady", _playerReadyHandler);
}
private function _playerReadyHandler(e:Event):void{
_player = _loader.content;
_player.setSize(320,240);
_player.loadVideoById("PiU5LbQf80w", 0, "small");
}
private var rot:Number = 0 // 角度
private function _enterFrameHandler(e:Event):void{
var time:Number = getTimer();
// カメラが演習を回っているように設定しています
camera.x = 2000 * Math.sin(time / 3000);
camera.y = 800 * Math.sin(time / 2000);
camera.z = 2000 * Math.cos(time / 3000);
// カメラが近づいたり離れたりする演出
camera.zoom = 15 * Math.sin(time / 4000) + 40;
//PV3Dのレンダリング
singleRender();
}
/*
フレーム毎に衛星の配置角度を0.5度ずつ加算し、
それをカメラの座標に変換しています。
カメラの座標は三角関数(sinとcos)を使って、角度から求めています。
1000という値は円の半径です。
*/
private function _enterFrameHandler2(e:Event):void{
rot += 0.5 // 毎フレーム角度を0.5度ずつ足していく
// 角度に応じてカメラの位置を設定
camera.x = 1000 * Math.sin(rot * Math.PI / 180)
camera.z = 1000 * Math.cos(rot * Math.PI / 180)
//PV3Dのレンダリング
singleRender();
}
private function _enterFrameHandler3(e:Event):void{
// マウスの位置に応じて角度を設定
// マウスのX座標がステージの幅の何%の位置にあるか調べてそれを360度で乗算する
var targetRot:Number = ( mouseX / stage.stageWidth ) * 360
// イージングの公式を用いて滑らかにする
// 値 += (目標値 - 現在の値) * 減速値
rot += (targetRot - rot) * 0.02;
// 角度に応じてカメラの位置を設定
camera.x = 1000 * Math.sin(rot * Math.PI / 180)
camera.z = 1000 * Math.cos(rot * Math.PI / 180)
//PV3Dのレンダリング
singleRender();
}
}
}