Away3DでMD2の読み込みと環境マップ。
Away3D 3.6.0でMD2モデルの読み込みとマテリアルの設定を試す。
EnviroColorMaterialを使用すれば反射の画像だけで金属系のものは簡単に表現できそう。
画面をドラッグでカメラの始点が移動します。
package {
import away3d.cameras.*;
import away3d.containers.*;
import away3d.materials.*;
import away3d.primitives.*;
import away3d.core.utils.*;
import away3d.core.base.*;
import away3d.debug.*;
import away3d.loaders.*;
import away3d.loaders.data.*;
import away3d.lights.*;
import away3d.test.*;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
public class NMain extends MovieClip {
//-------------------------------------------------------------------------------- Properties
private var _this:*;
private var _stage:Stage;
[Embed(source="test.md2", mimeType="application/octet-stream")]
private static const testmd2:Class;
//-------------------------------------------------------------------------------- Constractor
public function NMain() {
_this = this;
_stage = stage;
_stage.scaleMode = StageScaleMode.NO_SCALE;
_stage.align = StageAlign.TOP_LEFT;
_stage.quality = "low";
Init();
}
//-------------------------------------------------------------------------------- Function
/**
* initialize
*/
public function Init():void {
setup();
}
/**
* setup
*/
private function setup():void {
setup_main();
setup_3dengine();
setup_object();
setup_action();
}
/**
* main
*/
private var _main:MovieClip;
private function setup_main():void {
_main = new MovieClip();
_this.addChild(_main);
_stage.addEventListener(Event.RESIZE, main_resize);
main_resize();
}
//
private function main_resize(eo:* = null):void {
_main.x = Math.round(_stage.stageWidth / 2);
_main.y = Math.round(_stage.stageHeight / 2);
}
/**
* setup action
*/
private var docamera:Boolean = false;
private var lastpanangle:Number;
private var lasttiltangle:Number;
private var lastmposx:Number;
private var lastmposy:Number;
private function setup_action():void {
_this.addEventListener(Event.ENTER_FRAME, _enterframe);
_stage.addEventListener(MouseEvent.MOUSE_DOWN, _mousedown);
_stage.addEventListener(MouseEvent.MOUSE_UP, _mouseup);
}
//
private function _enterframe(eo:* = null):void {
if(docamera) {
camera.panAngle = (_stage.mouseX - lastmposx) + lastpanangle * .8;
camera.tiltAngle = (_stage.mouseY - lastmposy) + lasttiltangle * .8;
}
camera.hover();
view.render();
}
//
private function _mousedown(eo:* = null):void {
docamera = true;
lastpanangle = camera.panAngle;
lasttiltangle = camera.tiltAngle;
lastmposx = _stage.mouseX;
lastmposy = _stage.mouseY;
_stage.addEventListener(Event.MOUSE_LEAVE, _mouseleave);
}
//
private function _mouseup(eo:* = null):void {
docamera = false;
_stage.removeEventListener(Event.MOUSE_LEAVE, _mouseleave);
}
//
private function _mouseleave(eo:* = null):void {
docamera = false;
_stage.removeEventListener(Event.MOUSE_LEAVE, _mouseleave);
}
/**
* setup 3dengine
*/
private var scene:Scene3D;
private var camera:*;
private var view:View3D;
private function setup_3dengine():void {
scene = new Scene3D();
camera = new HoverCamera3D();
camera.minTiltAngle = -80;
camera.maxTiltAngle = 80;
camera.panAngle = 255;
camera.tiltAngle = 10;
camera.steps = 50;
view = new View3D();
view.scene = scene;
view.camera = camera;
var awaystats:AwayStats = new AwayStats(view);
//_this.addChild(awaystats);
var t:Trident = new Trident(100, true);
t.y = -200;
//scene.addChild(t);
_main.addChild(view);
}
/**
* setup object
*/
private function setup_object():void {
//setup_light();
var _testmd2 = Md2.parse(Cast.bytearray(new testmd2()));
_testmd2.scale(0.08);
var mat_normal = new Dot3BitmapMaterial(Cast.bitmap(TorsoImage), Cast.bitmap(TorsoNormal));
mat_normal.specular = 0x808080;
//var mat_enviro = new EnviroBitmapMaterial(Cast.bitmap(TorsoImage), Cast.bitmap(tex_1));
var mat_enviro = new EnviroColorMaterial(0xFFFEFE, Cast.bitmap(tex_1));
mat_enviro.reflectiveness = .95;
var mat_phong = new PhongBitmapMaterial(Cast.bitmap(TorsoImage));
mat_phong.specular = 0x808080;
var mat_flat = new WhiteShadingBitmapMaterial(Cast.bitmap(TorsoImage));
_testmd2.material = mat_enviro;
scene.addChild(_testmd2);
}
//
private var light:*;
function setup_light():void {
light = new DirectionalLight3D();
light.color = 0xFFFFFF;
light.ambient = .25;
light.diffuse = .75;
light.specular = 9;
light.direction = new Vector3D(-1, -1, -1);
scene.addLight(light);
}
}
}