In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

3DStar

星を作ってみました。
星を作るときに使用可能なマテリアルと
使用不可なマテリアルもあるみたいです。
すべて確認してはいません。すみません・・
Get Adobe Flash player
by sion0303 15 Apr 2010
/**
 * Copyright sion0303 ( http://wonderfl.net/user/sion0303 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/aNHx
 */

/*
	星を作ってみました。
	星を作るときに使用可能なマテリアルと
	使用不可なマテリアルもあるみたいです。
	すべて確認してはいません。すみません・・
*/
package {
	import flash.events.Event;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.view.BasicView;
	[SWF(backgroundColor=0x0)]
	public class PV3D_Star extends BasicView
	{
		private var star:Star3D;
		private var cnt:Number;
		private var light:PointLight3D;
		public function PV3D_Star()
		{	
			cnt = 0;
			light = new PointLight3D();
			var material:FlatShadeMaterial = new FlatShadeMaterial(light, 0xffff00, 0x111111, 50);
			material.doubleSided = true;
			
			star = new Star3D(material);
			
			scene.addChild(star);
			
			startRendering();
			
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		private function onEnterFrame(event:Event):void
		{			
			star.rotationY+=2;
			cnt += 0.01;
			light.x = 1000 * Math.cos(cnt);
			light.z = 1000 * Math.sin(cnt);
		}
	}
}

import org.papervision3d.core.geom.TriangleMesh3D;
import org.papervision3d.core.geom.renderables.Triangle3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.objects.DisplayObject3D;

/* 3D星クラス */
class Star3D extends DisplayObject3D
{
	public var meshes:Array;			
	public var divide:int;			
	public var angle:Number;		
	private var radius:Number;		
	/*
		第一引数:マテリアル
		第二引数:大きさ
		第三引数:分割数
		第四引数:両面作成するかどうか
	*/
	public function Star3D(material:MaterialObject3D=null, radius:Number=500, divide:int=5, side:Boolean=true)
	{
		// 大きさ
		if(radius < 10)
			this.radius = 10;
		else
			this.radius = radius;
		
		// 分割数
		this.divide = divide;
				
		// 角度
		// 分割数が3未満の場合
		if(divide < 3)
		 	this.angle = 360 / (3 * 2);
		// 分割数が3以上の場合
		else 
			this.angle = 360 / (divide * 2);
			
		// 片面だけ作るか両面作るか
		var num:int = 1;
		if(side)
			num = 2;
		
		// 星の作成
		meshes = [];
		for(var i:int = 0; i < num; i++) {
			for(var j:int = 0; j < divide * 2; j++) {
				var vertices:Array = [];
				var x1:Number;
				var y1:Number;
				var x2:Number;
				var y2:Number
				var p1:int;
				var p2:int;
				var vx:Number;
				var vy:Number;
				// 1つ目の頂点
				if(i % 2)
					vertices.push(new Vertex3D(0, 0, radius/3));
				else
					vertices.push(new Vertex3D(0, 0, -radius/3));
				
				if(j % 2) {
					p1 = j;
					p2 = j + 1;
				} else {
					p1 = j + 1;
					p2 = j;
				}
				// 2つ目の頂点
				x1 = radius / 2 * Math.cos(this.angle * p1 * Math.PI / 180);
				y1 = radius / 2 * Math.sin(this.angle * p1 * Math.PI / 180);
				vertices.push(new Vertex3D(x1, y1, 0));
				
				// 3つ目の頂点
				x2 = radius * Math.cos(this.angle * p2 * Math.PI / 180);
				y2 = radius * Math.sin(this.angle * p2 * Math.PI / 180);
				vertices.push(new Vertex3D(x2, y2, 0));
				
				// メッシュ作成
				var mesh:TriangleMesh3D = new TriangleMesh3D(material, [], []);
				
				// メッシュに頂点の配列を追加して頂点座標を指定
				mesh.geometry.vertices = vertices;
				
				// メッシュに面を追加
				mesh.geometry.faces.push(new Triangle3D(mesh, vertices));
				
				// メッシュを格納
				this.meshes.push(mesh);
				
				// DisplayObject3Dに追加
				this.addChild(mesh);
			}
		}
	}
}