
Papervision3Dが大幅アップデートで2.0(コード名:GreatWhite)に。何が変わったかというと。。。
まぁとりあえずの、サンプル。インタラクティブではないよ。
サンプル
Lightパッケージ追加でライトが使えるようになった。内部の座標計算が、ローカル座標→ワールド座標変換→ビュー座標変換→プロジェクション座標変換→スクリーン座標変換という一般的な3D計算の流れに基づくようになった。Viewパッケージ追加でなんか書き方大幅に変わった。けどBasicViewクラスとか継承すればコードが12行で作れたりするものもあったりで慣れれば便利っぽい。
後はよく分かりませんが、色々変わって検証しなおしって感じなのです。他力本願だとこうなるから、ROXIKの城戸さんみたいに自作3Dフレームワーク作りたいな。城戸さん新作楽しみにしてますー。AS3も慣れてきたし暇ができたらやってみようかな~。
はい。というわけで、以下が上のサンプルのソースです。ドキュメントクラスですよー。
package{
import flash.display.*;
import flash.events.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.lights.*;
public class BasicDocument extends Sprite{
private var scene:Scene3D;
private var viewport:Viewport3D;
private var camera:Camera3D;
private var renderer:BasicRenderEngine;
private var objCube:Cube;
private var objPlane:Plane;
private var light:PointLight3D;
public function BasicDocument(){
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.MEDIUM;
init3D();
}
private function init3D():void{
//ビューポート設定
viewport = new Viewport3D(0,0,true);
viewport.opaqueBackground = 0x222222;
addChild(viewport);
light = new PointLight3D();
light.x = light.y = light.z = 500;
light.z = -100;
//レンダー設定
renderer = new BasicRenderEngine();
//カメラ設定
camera = new Camera3D();
camera.z = -300;
camera.focus = 500;
camera.zoom = 1;
//シーン設定
scene = new Scene3D();
//マテリアル設定
var colorMat:ColorMaterial = new ColorMaterial( 0x006699, 1 );
var wireMat:WireframeMaterial = new WireframeMaterial( 0x0099cc );
var compoMat:CompositeMaterial = new CompositeMaterial();
compoMat.addMaterial(colorMat);
compoMat.addMaterial(wireMat);
compoMat.doubleSided = true;
//Plane生成
objCube = new Cube(new MaterialsList({all:new GouraudMaterial(light)}), 300, 300, 300);
scene.addChild(objCube);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
objCube.rotationX += 2;
objCube.rotationY += 2;
renderer.renderScene(scene,camera,viewport);
}
}
}

