[Return]
GeoSphere
バージョン:Alternativa 3D 8.17.0
Alternativa3D 8 には、デフォルトの図形(プリミティブ)として、球である GeoSphere が用意されています。
これを基本のソースを元に表示してみましょう
package
{
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.events.Event;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3D;
import alternativa.engine3d.core.Resource;
import alternativa.engine3d.core.View;
import alternativa.engine3d.primitives.GeoSphere;
import alternativa.engine3d.materials.FillMaterial;
public class Main extends Sprite
{
private var stage3D:Stage3D; // Stage3D
private var camera:Camera3D; // カメラ
private var scene:Object3D; // 3D空間
private var sphere:GeoSphere; // 球
//
// コンストラクタ(クラスの定義処理)
//
public function Main()
{
// ステージに追加されたら、初期化処理を呼ぶ
addEventListener(Event.ADDED_TO_STAGE, init);
}
//
// 初期化
//
private function init(ev:Event):void
{
// 3D の空間を定義
scene = new Object3D();
// 3D カメラ作成
camera = new Camera3D(1, 10000);
// カメラが描画する範囲(view)をステージサイズに設定
camera.view = new View(stage.stageWidth, stage.stageHeight);
camera.rotationX = 180 * Math.PI / 180;
addChild(camera.view);
// 統計情報の表示
addChild(camera.diagram);
//
// カメラの座標設定
//
camera.x = 0;
camera.y = 0;
camera.z = 100;
// カメラの座標設定
scene.addChild(camera);
// 0 番目の Stage3D を利用
stage3D = stage.stage3Ds[0];
// Context3D が作成された際に呼ばれるハンドラを設定
stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
// Stage3D に Context3D の作成を要求
stage3D.requestContext3D();
}
//
// Stage3D に Context3D の準備が出来たときに呼ばれるイベントハンドラ
//
private function onContextCreate(e:Event):void
{
// イベントリスナーを削除
stage3D.removeEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
//
// GeoSphere を空間に追加
//
sphere = new GeoSphere(25, 4, false, new FillMaterial(0xff0000, 1.0));
scene.addChild(sphere);
// scene にある 3D リソースを取得して、Context3D にアップロード
var resources:Vector.<Resource> = scene.getResources(true);
for each (var resource:Resource in resources)
{
resource.upload(stage3D.context3D);
}
//
// 毎フレーム毎の処理を設定
//
addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
//
// 毎フレーム毎の処理のイベントハンドラ
//
private function onEnterFrameHandler(ev:Event):void
{
// カメラで見えているものを Stage3D に描画する
camera.render(stage3D);
}
}
}
基本から追加されたのは、下記の三ヶ所です。
import alternativa.engine3d.primitives.GeoSphere; import alternativa.engine3d.materials.FillMaterial;
private var sphere:GeoSphere; // 球
sphere = new GeoSphere(25, 4, false, new FillMaterial(0xff0000, 1.0)); scene.addChild(sphere);
GeoSphere を作成し、空間に配置します。
配置する場所は指定していませんので、デフォルトの場所である原点(0, 0, 0)に配置されます。
GeoSphere の面には、ベタ塗りの素材である「FillMaterial」を割り当てます。
このため画面上には、赤のベタ塗りの四角が表示されます。
FillMaterial はライトが無くてもベタ塗りとして表示されますので、図形が表示されているかどうかを区別するのには、分かりやすい素材です。
球を置いたのに、なんで平面的な円なの?と思われた方もいらっしゃるかもしれません。
Box の時と同様に、毎フレームごとに箱の回転軸の値を変えて、球を回してみましょう。
//
// 毎フレーム毎の処理のイベントハンドラ
//
private function onEnterFrameHandler(ev:Event):void
{
// 球を回す
sphere.rotationX += 0.5 * Math.PI / 180;
sphere.rotationY += 0.5 * Math.PI / 180;
// カメラで見えているものを Stage3D に描画する
camera.render(stage3D);
}
Box の時とは違って、あまり回っているようには見えませんね。
これは、球らしくみせようと分割数を上げると、滑らかな曲面になるかわりに、角度が変わっているような変化がなくなってしまうからです。
分割数を下げれば、Box のように回転している際の変化を見せることも出来ますが、それでは球ではなくて、多角形の図形になってしまいます。
球で回転しているように見せるには、FillMaterial では困難です。
マテリアルをテクスチャーを使ったものに変更する必要があります。
さらにライトを追加すると、より立体的に見せることが出来ます。
その辺は、マテリアルやライトの使い方になりますので、そちらで紹介します。
| ツイート |
[Return]

