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

頂点番号表示クラス

プリミティブオブジェクトのどの頂点が頂点番号何番なのか今一分からないので、
fork元のsakeさんのコードのShapeをTextFieldにして
TextFieldの位置を各頂点の座標に合わせ、頂点番号を表示しました。
クラス化してテスト用に使えるようにしたい。

↓

一応クラス化しました。
メインクラスに書くコードを最小限にとどめようと思ったらこうなりました。
TextFormatとかいじれるようにする必要がありますね。
Get Adobe Flash player
by Nicolas 10 Jan 2010
/**
 * Copyright Nicolas ( http://wonderfl.net/user/Nicolas )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/tKpK
 */

// forked from Nicolas's Sphereの頂点番号の表示 forked from: Pixel3Dの座標⇒普通のxy座標
// forked from sake's Pixel3Dの座標⇒普通のxy座標
/*
   プリミティブオブジェクトのどの頂点が頂点番号何番なのか今一分からないので、
   fork元のsakeさんのコードのShapeをTextFieldにして
   TextFieldの位置を各頂点の座標に合わせ、頂点番号を表示しました。
   クラス化してテスト用に使えるようにしたい。
   
   ↓
   
   一応クラス化しました。
   メインクラスに書くコードを最小限にとどめようと思ったらこうなりました。
   TextFormatとかいじれるようにする必要がありますね。 
 */

package
{
	import flash.events.ErrorEvent;
	import flash.text.TextField;
	import flash.display.Shape;
	import flash.display.StageQuality;
	import flash.events.Event;

	import org.papervision3d.core.effects.utils.BitmapClearMode;
	import org.papervision3d.view.layer.BitmapEffectLayer;
	import org.papervision3d.core.geom.Pixels;
	import org.papervision3d.core.geom.renderables.Pixel3D;
	import org.papervision3d.core.geom.renderables.Vertex3DInstance;
	import org.papervision3d.core.geom.renderables.Vertex3D;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.primitives.*;
	import org.papervision3d.view.BasicView;
	

	[SWF(width="465", height="465", backgroundColor="0x000000", frameRate="40")]
	public class Main extends BasicView
	{
		private const RADIUS:int = 90;
		private var pixels:Pixels;
		private var sphere:Sphere;
		private var plane:Plane;

		// コンストラクタ
		public function Main()
		{
			// もろもろの準備
			stage.quality=StageQuality.HIGH;
			super(0, 0, true, true);
			camera.z=-500;
			
			//マテリアルの生成
			var material:WireframeMaterial = new WireframeMaterial(0xdddddd, 0.1, 1);
			material.doubleSided = true;
			
			//Sphereの生成
			sphere = new Sphere(material, Math.sqrt(RADIUS * RADIUS * 3), 10, 10);
			sphere.x = -130;
			sphere.y = 130;
			scene.addChild(sphere);
			
			//Planeの生成
			plane = new Plane(material, 250, 250, 4, 4);
			plane.x = 150;
			plane.y = -150;
			scene.addChild(plane);
			
			
			//VertexNumberViewerを使用します
			//sphere用
			var viewer1:VertexNumberViewer = addChild(new VertexNumberViewer(sphere)) as VertexNumberViewer;
			//plane用
			var viewer2:VertexNumberViewer = addChild(new VertexNumberViewer(plane)) as VertexNumberViewer;
			
			// Let's レンダリング!
			startRendering();
			addEventListener(Event.ENTER_FRAME, onFrame);
		}

		// エンターフレーム
		private function onFrame(e:Event):void
		{
			sphere.rotationX+=0.5;
			sphere.rotationY+=0.5;
			plane.rotationY += 2;
		}
	}
}

import flash.display.*;
import flash.text.*;
import flash.events.Event;
import org.papervision3d.objects.*
import org.papervision3d.core.geom.renderables.*;
import org.papervision3d.core.effects.utils.BitmapClearMode;
import org.papervision3d.core.geom.Pixels;
import org.papervision3d.view.layer.BitmapEffectLayer;
import org.papervision3d.view.*;
import org.papervision3d.scenes.*;
/**
* 頂点の番号を表示させるクラスです。
* BasicViewに直接addChildして使います。sceneにaddChildするのではありません。
*/
class VertexNumberViewer extends Sprite
{
	
	private var pixels:Pixels;
	private var ary:Array;
	private var s:Scene3D;
	private var vp:Viewport3D;
	private var _obj:DisplayObject3D;
	private var verticesNum:uint;
	private var offsetX:Number;
	private var offsetY:Number;
	
	/**
	* コンストラクタ。
	* @param obj 頂点番号を表示させる対象オブジェクト
	*/
	public function VertexNumberViewer(obj:DisplayObject3D)
	{
		_obj = obj;
		addEventListener(Event.ADDED_TO_STAGE, onAdd);
	}
	
	/*
	* テキストフィールドなどの生成を行います。
	* 親オブジェクトやステージの大きさを知るため、ADD_TO_STAGEイベントのリスナにしています
	* @param e
	*/
	private function onAdd(e:Event):void {
		var bv:BasicView = this.parent as BasicView;
		s = bv.scene;
		vp = bv.viewport;
		
		
		var layer:BitmapEffectLayer = new BitmapEffectLayer(vp, 465, 465, true, 0, BitmapClearMode.CLEAR_PRE, true);
		layer.clearBeforeRender=true;
		vp.containerSprite.addLayer(layer);
		
		//Pixels生成
		pixels = new Pixels(layer);
		s.addChild(pixels);
		
		verticesNum = _obj.geometry.vertices.length;//頂点数
		var p:Pixel3D;
		var vertex:Vertex3D;
		for (var v:int = 0; v < verticesNum; v++)
		{
			vertex = _obj.geometry.vertices[v];
			p = new Pixel3D(0xFFFFFFFF, vertex.x, vertex.y, vertex.z);
			pixels.addPixel3D(p);
		}
		
		//TextField生成
		ary=[];
		var tf:TextField;
		for (var i:int=0; i < verticesNum; i++)
		{
			tf = new TextField();
			tf.textColor = 0xFFFFFF;
			tf.text = i.toString();
			addChild(tf);
			ary[i] = tf;
		}
		
		
		offsetX = stage.stageWidth >> 1;
		offsetY = stage.stageHeight >> 1;
				
		addEventListener(Event.ENTER_FRAME, redraw);
	}
	
	/**
	* テキストフィールドの位置を対象オブジェクトの座標と同期します。
	* とりあえずEnterFrameで回すようにしましたが、パフォーマンス上あんまりよくないかもしれないです
	* @param e
	*/
	public function redraw(e:Event = null):void
	{
		//pixelsの変換
		pixels.rotationX = _obj.rotationX;
		pixels.rotationY = _obj.rotationY;
		pixels.rotationZ = _obj.rotationZ;
		pixels.x = _obj.x;
		pixels.y = _obj.y;
		pixels.z = _obj.z;
		

		var v3d:Vertex3DInstance;
		var i:int=0;
		for each (var _p:Pixel3D in pixels.pixels)
		{
			v3d = _p.vertex3D.vertex3DInstance;
			if (v3d.visible)
			{
				(ary[i] as TextField).x=v3d.x + offsetX;
				(ary[i] as TextField).y=v3d.y + offsetY;
				i++;
			}
		}
	}
	
	
}