[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
PV3Dの使い方続き。今回はマテリアル関係。要するに色とかテクスチャね。
さて、シーンとカメラとビューとレンダラーを用意して、3D空間をレンダリングできるようにしたら、
シーンにオブジェクトを追加していこう。primitive クラスに基本モデルがあるので
とりあえず分かりやすい plane と cube のオブジェクトを出してみることに。
回転はRotationX / Y / Z の値をいじればいい。位置も x / y / z と分かりやすいね。
今回は plane にメッシュとワイヤーフレームに単色の色を、cube にテクスチャを張ってみた。
plane のマテリアルの設定の大雑把な方法:
ColorMaterial と WireframeMaterial を作って、 compositeMaterial に 追加する。
マテリアル情報をまとめるコンテナみたいな役割って感じ。
んで、それを plane のコンストラクタに渡してやる。これでマテリアルを設定できる。
cube のテクスチャの設定の大雑把な方法:
BitmapFileMaterial に画像を読み込む。パスを設定するだけで外部画像を読み込める優れモノ。
BitmapMaterial と BitmapAssetMaterial ってのもある。今回はBitmapFileMaterial で。
それを MaterialsList に追加する。 ココでポイント。
cube には当然6面メッシュがある。だから、どの面に貼るかを設定しなくちゃならない。
それが、cubeMat.addMaterial(texture, "all") ってやつ。
"all" は全面。それぞれ"front" "back" "left" "right" "top" "bottom" でアクセスできる。
んで、それを cube のコンストラクタに渡してやる。
色とかマテリアル張るだけでだいぶさまなってくるね。
直接 pv3d_test.swf にアクセスしないとテクスチャが出ない。クロスドメインがどーのってやつか
BitmapMaterial か BitmapAssetMaterial でやればいいんだろうけど、とりあえず保留。
package
{
import flash.display.Sprite;
import flash.events.Event;
import org.papervision3d.cameras.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.render.*;
import org.papervision3d.scenes.*;
import org.papervision3d.view.*;
[SWF (width = "320", height = "240", frameRate = "24")]
public class pv3d_test extends Sprite
{
// 3D空間の準備
private var scene:Scene3D = new Scene3D();
private var camera:Camera3D = new Camera3D(60, 5, 5000);
private var view:Viewport3D = new Viewport3D(640, 480, true);
private var renderer:BasicRenderEngine = new BasicRenderEngine();
// plane(一枚板) と cube(立方体)
private var plane:Plane;
private var cube:Cube;
// 色やテクスチャ
private var color:ColorMaterial;
private var wire:WireframeMaterial;
private var texture:BitmapFileMaterial;
// 素材のコンテナ
private var planeMat:CompositeMaterial = new CompositeMaterial();
private var cubeMat:MaterialsList = new MaterialsList();
public function pv3d_test()
{
// 素材を設定する
color = new ColorMaterial(0xFF0000, 0.8);
wire = new WireframeMaterial(0xFFFFFF, 80, 1);
texture = new BitmapFileMaterial("texture.jpg", true);
// 素材オブジェクトを素材コンテナに追加する
planeMat.addMaterial(color);
planeMat.addMaterial(wire);
// メッシュの両面に適用
planeMat.doubleSided = true;
// 素材オブジェクトを素材コンテナに追加する
cubeMat.addMaterial(texture, "all");
// オブジェクトの生成
plane = new Plane(planeMat, 120, 120);
cube = new Cube(cubeMat, 120, 120, 120);
// 位置調整
plane.x -= 100;
cube.x += 100;
camera.z = -500;
// オブジェクトを追加
scene.addChild(plane);
scene.addChild(cube);
// 表示リストに追加とイベントリスナー登録
stage.addChild(view);
stage.addEventListener(Event.ENTER_FRAME, update);
}
private function update(e:Event):void
{
// 適当に回転とかさせる
plane.rotationX += 0.5;
plane.rotationY += 1;
plane.rotationZ = mouseX / 10;
cube.rotationX += 0.5;
cube.rotationY += 1;
cube.rotationZ = mouseY / 10;
camera.z = mouseY * -1 / 2 - 500
// レンダリング処理
renderer.renderScene(scene, camera, view);
}
}
}