[ Papervision3D ] ネタ切れの正12面体 - 08/07/08 21:26
正20面体に続いて、懲りずに正しい12面体。
楽勝かと思ったけど、いざ実行したら何も表示されず。
よくよく見たら TriangleMesh3D である。3角ポリゴンじゃなきゃダメじゃん。
(´・ω・`) flash表示できんよ。
20面体は面が3角形なので何も考えずともそのままできたが、今度は面が5角形。
対角線を2本引いて3つの3角形に分割して終了、、でもなかった。
残ってるのはマテリアル。
前回同様にCompositeMaterialにColorMaterialとWireframeMaterialを指定すると、分割してる対角線にまでWireframeMaterialが適用されて見にくいことこの上ない。面の周りを5角形にラインを引きたかったのでLine3Dを使った。
Line3Dで線を引くにはLines3Dも必要になる。最初「s」を見落としていて混乱した。
この2つはTriangleMesh3DとTriangle3Dの関係に似てる。それぞれが属してるパッケージも同じだ。
Line3Dのコンストラクタの第1引数はsizeとあるが、これは太さ。続いて始点と終点。
これをLines3Dにaddしてシーンに貼付けると3D空間に線が引かれる。
ソースは前回とほぼ同じ。前回は使ってない変数やらゴミが混じっていたので綺麗にした。
図形描画は相変わらず力技で美しくない。
package{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import org.papervision3d.Papervision3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.materials.*;
import org.papervision3d.materials.special.LineMaterial;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.core.geom.Lines3D;
import org.papervision3d.core.geom.TriangleMesh3D;
import org.papervision3d.core.geom.renderables.Triangle3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.core.math.NumberUV;
public class Main extends MovieClip{
private var view:Viewport3D;
private var camera:Camera3D;
public var renderer:BasicRenderEngine;
private var scene:Scene3D;
public function Main(){
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
init();
stage.addEventListener(Event.ENTER_FRAME, myEnterFrame);
}
private function init():void{
Papervision3D.VERBOSE=false;
view = new Viewport3D(0, 0, true, true);
addChild(view);
renderer = new BasicRenderEngine();
scene = new Scene3D();
camera = new Camera3D();
camera.z = -3000;
camera.zoom=2;
camera.focus=600;
var A=(Math.sqrt(5)+1)*0.5;
var v:Array=[
new Vertex3D(1, 0, 0),
new Vertex3D(Math.cos(72*Math.PI/180), Math.sin(72*Math.PI/180), 0),
new Vertex3D(-Math.cos(36*Math.PI/180), Math.sin(36*Math.PI/180), 0),
new Vertex3D(-Math.cos(36*Math.PI/180), -Math.sin(36*Math.PI/180), 0),
new Vertex3D(Math.cos(72*Math.PI/180), -Math.sin(72*Math.PI/180), 0),
new Vertex3D(A, 0, 1),
new Vertex3D(A*Math.cos(36*Math.PI/180), A*Math.sin(36*Math.PI/180), A),
new Vertex3D(A*Math.cos(72*Math.PI/180), A*Math.sin(72*Math.PI/180), 1),
new Vertex3D(-A*Math.cos(72*Math.PI/180), A*Math.sin(72*Math.PI/180), A),
new Vertex3D(-A*Math.cos(36*Math.PI/180), A*Math.sin(36*Math.PI/180), 1),
new Vertex3D(-A, 0, A),
new Vertex3D(-A*Math.cos(36*Math.PI/180), -A*Math.sin(36*Math.PI/180), 1),
new Vertex3D(-A*Math.cos(72*Math.PI/180), -A*Math.sin(72*Math.PI/180), A),
new Vertex3D(A*Math.cos(72*Math.PI/180), -A*Math.sin(72*Math.PI/180), 1),
new Vertex3D(A*Math.cos(36*Math.PI/180), -A*Math.sin(36*Math.PI/180), A),
new Vertex3D(-1, 0, A+1),
new Vertex3D(-Math.cos(72*Math.PI/180), -Math.sin(72*Math.PI/180), A+1),
new Vertex3D(Math.cos(36*Math.PI/180), -Math.sin(36*Math.PI/180), A+1),
new Vertex3D(Math.cos(36*Math.PI/180), Math.sin(36*Math.PI/180), A+1),
new Vertex3D(-Math.cos(72*Math.PI/180), Math.sin(72*Math.PI/180), A+1)
];
var obj:DisplayObject3D=new DisplayObject3D();
obj.name="obj";
obj.rotationX=10;
obj.rotationZ=10;
scene.addChild(obj);
for(var i:uint=0; i<20; i++){
var sp:Sphere=new Sphere(new ColorMaterial(0xff0000), 7);
sp.x=v[i].x*=200;
sp.y=v[i].y*=200;
sp.z=v[i].z*=200;
obj.addChild( sp );
}
makeMesh( [ v[4], v[3], v[2], v[1], v[0] ] );
makeMesh( [ v[1], v[7], v[6], v[5], v[0] ] );
makeMesh( [ v[2], v[9], v[8], v[7], v[1] ] );
makeMesh( [ v[3], v[11], v[10], v[9], v[2] ] );
makeMesh( [ v[4], v[13], v[12], v[11], v[3] ] );
makeMesh( [ v[0], v[5], v[14], v[13], v[4] ] );
makeMesh( [ v[15], v[16], v[17], v[18], v[19] ] );
makeMesh( [ v[8], v[9], v[10], v[15], v[19] ] );
makeMesh( [ v[10], v[11], v[12], v[16], v[15] ] );
makeMesh( [ v[12], v[13], v[14], v[17], v[16] ] );
makeMesh( [ v[14], v[5], v[6], v[18], v[17] ] );
makeMesh( [ v[6], v[7], v[8], v[19], v[18] ] );
}
private function makeMesh(prmVertex:Array):void{
makeTri(prmVertex[0], prmVertex[2], prmVertex[1] );
makeTri(prmVertex[0], prmVertex[3], prmVertex[2] );
makeTri(prmVertex[0], prmVertex[4], prmVertex[3] );
for(var i:uint=0; i<5; i++){
var lines:Lines3D = new Lines3D( new LineMaterial(0xFFFF00) );
lines.addNewLine( 2, prmVertex[i].x, prmVertex[i].y, prmVertex[i].z, prmVertex[(i+1)%5].x, prmVertex[(i+1)%5].y, prmVertex[(i+1)%5].z );
scene.getChildByName("obj").addChild( lines );
}
}
private function makeTri(v0, v1, v2):void{
var tri:TriangleMesh3D = new TriangleMesh3D( new ColorMaterial(Math.round(Math.random()*16777215), 0.95), [ v0, v1, v2 ], [] );
tri.geometry.faces.push( new Triangle3D( tri, [ v0, v1, v2 ], null, [new NumberUV( 0.5, 1 ), new NumberUV( 0, 0 ), new NumberUV( 1, 0 )] ));
tri.geometry.ready = true;
scene.getChildByName("obj").addChild( tri );
}
private function myEnterFrame(ev:Event):void{
var omegaY:Number = -stage.mouseX*0.02+4;
DisplayObject3D(scene.getChildByName("obj") ).rotationY += omegaY;
renderer.renderScene(scene, camera, view);
}
}
}
« [ Papervision3D ] 正20面体 | ブログトップ | [ AIR ] Vistaでブラウザ挙動がおかしい? »
トラックバックURL :
コメント (1)
Thank you
groowDitFig - 2008年08月03日 18:19
コメント投稿
(´・ω・`) flash表示できんよ。