変な動き?(TriangleMesh3Dの座標の変更)
TriangleMesh3Dの座標の変更の練習用に作成
座標を変更したときFlatShadeMaterialの光源がが対応していなかった(?)のでColorMaterialを使用
♥0 |
Line 100 |
Modified 2011-04-14 11:14:30 |
MIT License
archived:2017-03-20 12:12:46
ActionScript3 source code
/**
* Copyright hi.kurosawa ( http://wonderfl.net/user/hi.kurosawa )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/qu2B
*/
//--------------------------------------------
//変な動き(TriangleMesh3Dの座標の変更)
// URL:http://programmingatelier.net/
//--------------------------------------------
package {
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.objects.*;
import org.papervision3d.lights.*;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.view.*;
import org.papervision3d.core.geom.TriangleMesh3D;
import org.papervision3d.core.geom.renderables.Triangle3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import flash.events.Event;
public class TriangleMesh3D3 extends BasicView {
//3D形状の配置領域
private var rootNode:DisplayObject3D;
//カメラ位置を求める角度
//private var kakudo0:Number;
private var kakudo1:Number;
private var kakudo2:Number;
private var kakudo3:Number;
private var arrVec3D:Array;
private var mesh:TriangleMesh3D;
public function TriangleMesh3D3():void {
//3D形状の配置領域作成
rootNode = new DisplayObject3D();
this.scene.addChild(rootNode);
//マテリアル定義
var compoMat:CompositeMaterial = new CompositeMaterial();
var matColor:ColorMaterial = new ColorMaterial(0x00ff00);
var matWire:WireframeMaterial= new WireframeMaterial( 0x000000, 0.2);
compoMat.addMaterial(matColor);
compoMat.addMaterial(matWire);
compoMat.doubleSided = true; //裏表示
//使用する座標を求める
arrVec3D = new Array();
kakudo3 = 0;
mesh = new TriangleMesh3D( compoMat, new Array(), new Array(), null );
fncSetPoint(true);
//形状の作成
for (var i:Number = 0; i < 20; i++) {
for (var j:Number = 0; j < 20; j++) {
//三角2枚で四角を作成
mesh.geometry.faces.push( new Triangle3D( mesh,
new Array(
arrVec3D[i+j*21],
arrVec3D[i+21+j*21],
arrVec3D[i+1+j*21])
, null,null ));
mesh.geometry.faces.push( new Triangle3D( mesh,
new Array(
arrVec3D[i+1+j*21],
arrVec3D[i+21+j*21],
arrVec3D[i+22+j*21])
, null,null ));
}
}
rootNode.addChild(mesh);
//カメラ用角度クリア
//kakudo0 = 0;
kakudo1 = 0;
kakudo2 = 0;
//繰り返し処理登録
addEventListener(Event.ENTER_FRAME, onFrame);
}
//XYからZ値を求める式
private function fncGetZ(x:Number, y:Number):Number {
var z:Number = 30.0 * (Math.cos(Math.sqrt(x * x + y * y)*Math.PI/180.0)
+ Math.cos(3.0 * Math.sqrt(x * x + y * y)*Math.PI/180.0));
return z;
}
private function onFrame(e:Event):void {
//カメラを回転させるための角度を増加させる
//kakudo0 += 0.3;
kakudo1++;
kakudo3++;
if (kakudo1 >= 360) { kakudo1 = 0; }
//if (kakudo0 >= 360) { kakudo0 -= 360; }
if (kakudo3 >= 360) { kakudo3 -= 360; }
kakudo2 = 50; //Math.sin(kakudo0 * Math.PI / 180) * 80;
fncSetPoint(false);
//カメラの位置セット、形状表示
onSlChmg();
}
//カメラの位置セット、形状表示
private function onSlChmg():void {
//カメラ位置
var kyori:Number = 500;//原点・カメラの距離
//高さ方向の角度(ラジアン)
var ang1:Number = kakudo2 * Math.PI / 180.0;
//方向(ラジアン)
var ang2:Number = Math.cos((kakudo1-180) * Math.PI / 180.0);
var x:Number=kyori*Math.cos(ang1)*Math.sin(ang2);
var y:Number=kyori*Math.cos(ang1)*Math.cos(ang2);
var z:Number = kyori*Math.sin(ang1);
this.camera.x = x;
this.camera.z = y;
this.camera.y = z;
this.renderer.renderScene( this.scene , this.camera , this.viewport );
}
private function fncSetPoint(bolFlg:Boolean):void {
var dx:Number=Math.sin(kakudo3 *1.2354* Math.PI / 180) * 570;
var dy:Number = Math.cos(kakudo3 * Math.PI / 180) * 570-870;
var iloop:int = 0;
for (var x:Number = -200; x <= 200; x += 20) {
for (var y:Number = -200; y <= 200; y += 20) {
if(bolFlg==true) {
var v3dP:Vertex3D = new Vertex3D(x, fncGetZ(x+dx, y+dy), y);
arrVec3D.push(v3dP);
mesh.geometry.vertices.push( v3dP );
} else {
mesh.geometry.vertices[iloop].y=fncGetZ(x + dx, y + dy);
iloop++;
}
}
}
}
}
}