PV3Dでオブジェクトの頂点座標を取得し、その位置を移動してみます。
DispalyObject3DはVertex3Dで表される頂点のデータをもとに形成されています。
頂点座標は配列で管理されており、下記の方法で取得できます。
var array:Array = DispalyObject3D.geometry.vertices
どの点がどこを指すかは一つ一つ調べていくしかないみたいです。
これようにチェッククラスみたいなのを作っておいた方が便利かもしれないですね。
サンプル
JavascriptをONにし、最新のFlashプレーヤーをインストールしてください。
ドキュメントクラス
package
{
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import net.hires.debug.Stats;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
public class Main extends BasicView
{
private var _plane:Plane;
private var _segW:uint = 10;
private var _segH:uint = 10;
private var _rad:Number = 0;
private var _speed:Number=0.2;
private var _delay:Number = 10
public function Main():void
{
super(0, 0, true);
_init()
}
private function _init():void
{
var bmd:BitmapData = new Img(0, 0);
var bm:BitmapMaterial = new BitmapMaterial(bmd)
bm.doubleSided = true;
bm.smooth = true;
_plane = new Plane(bm, 300, 300, _segW, _segH);
scene.addChild(_plane);
startRendering();
addEventListener(Event.ENTER_FRAME, _onEnterFrameHandler);
addChild(new Stats())
}
private function _wave():void
{
for ( var i:String in _plane.geometry.vertices )
{
var v3d:Vertex3D = _plane.geometry.vertices[i] as Vertex3D;//頂点データ
var h:Number = v3d.x * v3d.y / (300*300) * _delay;
v3d.z = 40 * Math.sin(_rad + h);
}
_rad += _speed;
}
private function _onEnterFrameHandler(e:Event):void
{
_plane.yaw((mouseX - (stage.stageWidth >> 1) ) / 30);
_plane.pitch((mouseY - (stage.stageWidth >> 1)) / 30);
_wave();
}
}
}
Planeの頂点を取得し、そのx,yの座標に応じてz値を変化させてみました。
42行目でDispalyObject3Dが持つ各頂点座標を取得しています。
Vertex3Dが頂点を示しx,y,zを操作可能です。
分割数は10*10ですが、意外と滑らかに波打ってくれてました。

コメントする