Papervision3Dをやってみた23
頂点制御です。
こんな感じです。
Planeを生成するとき、第4、第5引数の分割数によって、頂点の数が決まります。
注意するのは、分割数と頂点の数は違うということです。
例えば、横の分割数を4、縦の分割数を3にした場合、横に並ぶ頂点の数は5で縦に並ぶ頂点の数は4になります。
下の図のような感じ。
赤が横の頂点。緑が縦の頂点です。
今回は頂点をfor-each文で回していますが、アクセスする順番は、左下から始まって、上までアクセス、終わったら次の行に移動。
こんな感じで最後までアクセスしていきます。
分かりづらい説明ですみません。
何かの参考になればと。
以下、ソースです。
(2009/3 ソース書き直しました。)
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF(backgroundColor="#000000")]
public class Papervision3D_sample28 extends Sprite
{
[Embed(source='kurumi.jpg')]
private var img:Class;
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera:Camera3D;
private var renderer:BasicRenderEngine;
private var rootNode:DisplayObject3D;
private var plane:Plane;
private var theta:int=0;
public function Papervision3D_sample28()
{
stage.frameRate=30;
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
stage.quality=StageQuality.LOW;
viewport=new Viewport3D(0, 0, true, true);
scene=new Scene3D();
camera=new Camera3D();
renderer=new BasicRenderEngine();
rootNode=scene.addChild(new DisplayObject3D("rootNode"));
addChild(viewport);
camera.zoom=30;
camera.focus=30;
camera.target=DisplayObject3D.ZERO;
var bmpd:BitmapData=(new img as Bitmap).bitmapData;
var mat:BitmapMaterial=new BitmapMaterial(bmpd, true);
mat.doubleSided=true;
plane=new Plane(mat, bmpd.width, bmpd.height, 15, 15);
rootNode.addChild(plane);
addEventListener(Event.ENTER_FRAME, onFrame);
}
public function onFrame(e:Event):void
{
var s:int=0;
var c:int=0;
// 頂点を制御して、サインカーブを適用
for each (var obj:Vertex3D in plane.geometry.vertices)
{
obj.z=80 * Math.sin((theta + s) * Math.PI / 180);
c++;
if (c % 15 == 0)
s+=20;
}
theta+=15;
plane.rotationX+=0.5;
plane.rotationY+=0.5;
renderer.renderScene(scene, camera, viewport);
}
}
}
| 固定リンク

コメント