東京てら子11 Alternativa3Dについて その8
東京てら子11で使用したサンプルその8
オブジェクト(メッシュ)の形を変えてみよう
Meshの構造を理解し、頂点にアクセス。
2011/01/12 7.5から7.6仕様に変更
http://marubayashi.net/alternativa3d7/tokyoteraco11/index.html
/**
* Copyright narutohyper ( http://wonderfl.net/user/narutohyper )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/motg
*/
package
{
import alternativ7.engine3d.materials.TextureMaterial;
import alternativ7.engine3d.primitives.Plane;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import alternativ7.engine3d.containers.ConflictContainer
import alternativ7.engine3d.core.View
import alternativ7.engine3d.core.Camera3D
import alternativ7.engine3d.controllers.SimpleObjectController
import alternativ7.engine3d.primitives.Box
import alternativ7.engine3d.materials.FillMaterial
import alternativ7.engine3d.loaders.MaterialLoader;
import alternativ7.engine3d.core.Vertex;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
/**
* TokyoTeraco11 その8
* オブジェクト(メッシュ)の形を変えてみよう
*
* @author narutohyper
*/
[SWF(backgroundColor="#000000", frameRate="60")]
public class Main7_1 extends Sprite
{
public function Main7_1():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.BEST;
//ルートオブジェクト(Root Object)
var container:ConflictContainer = new ConflictContainer();
//ビューを作る
var view:View = new View(stage.stageWidth, stage.stageHeight);
addChild(view);
//カメラを作る
var camera:Camera3D = new Camera3D();
//カメラとビューを関連付ける
camera.view = view;
//カメラを撮影する3D空間に配置する
container.addChild(camera);
//カメラの位置を調整
camera.x = 0;
camera.y = -500;
camera.z = 0;
//カメラをコントローラ
var cameraController:SimpleObjectController = new SimpleObjectController(stage, camera, 10);
cameraController.mouseSensitivity = 0
cameraController.unbindAll()
cameraController.lookAtXYZ(0, 0, 0)
var segment:uint = 36
var plane:Plane = new Plane(360, 360, segment, 1, true);
//マテリアルを作成
var material:FillMaterial = new FillMaterial(0x666666, 1, 0, 1);
plane.setMaterialToAllFaces(material);
container.addChild(plane)
plane.rotationX=Math.PI/180*20;
//Yの座標で頂点を振り分ける
var verticies:Vector.<Vector.<Vertex>> = new Vector.<Vector.<Vertex>>(segment+1);
var interval:Number = 360 / segment;
for (var i:int = 0; i <= segment; i++)
{
verticies[i] = new Vector.<Vertex>();
}
for (var item:Object in plane.vertices)
{
i=(Vertex(plane.vertices[item]).x+180)/interval
verticies[i].push(plane.vertices[item])
}
//オブジェクトコントローラを追加
var objectController:SimpleObjectController = new SimpleObjectController(stage, plane, 10);
objectController.mouseSensitivity = 1
objectController.unbindAll()
addEventListener(Event.ENTER_FRAME, onEnterFrame)
var RADIAN:Number = Math.PI/180
var angle:Number=0
function onEnterFrame(e:Event):void
{
angle+=0.5
for(i=0;i<=segment;i++) {
var vz:Number = Math.sin((i + angle) * 10 * RADIAN) * 20;
var count:int = verticies[i].length
for (var j:int = 0; j < count; j++)
{
verticies[i][j].z=vz
}
}
//カメラコントローラの操作をコントロールオブジェクトに反映
cameraController.update();
//オブジェクトコントローラの操作をコントロールオブジェクトに反映
objectController.update();
//レンダリング
camera.render();
}
}
}
}