(※ papervision3dを使用しています。)
任意の数を円周上に均等配置し、押したオブジェクト(平面)を中央に移動させる回転式のギャラリーを作成しています。
任意のオブジェクトを押した際に、それぞれのオブジェクトが
元あった位置(A点)から到達したい位置(B点)に移動する仕組みなのですが、その移動の仕方が直線的になってしまいます。
(円回転のギャラリーなので、円周上を通るように動かしたい)
Tweenerクラスを使用して _bezierで中継地点を作ろうと思うのですが、その中継地点の割り出し方が分りません。
適切な計算方法などはありますでしょうか?
package {
import flash.display.*;
import flash.events.*;
import flash.filters.BlurFilter;
import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.text.TextField;
import fl.transitions.*;
import org.papervision3d.objects.primitives.*
import org.papervision3d.view.BasicView;
import org.papervision3d.core.effects.view.ReflectionView;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.view.Viewport3D;
import caurina.transitions.Tweener;
import caurina.transitions.properties.CurveModifiers;
CurveModifiers.init();
[SWF (width="600",height="400",frameRate="30") ]
public class test extends BasicView {
private var _viewport:Viewport3D = new Viewport3D;
private var sph;
private var pla;
private var _plaArr:Array = []; // 平面を格納する配列
private const MAX_pla:int = 8; // 平面の個数
/*----------------------------------------------------------------
☆コンストラクタ
----------------------------------------------------------------*/
public function test () {
super(600, 400, false, true);
_viewport.interactive = true;
for (var i:int = 0; i <MAX_pla; i++) {
//マテリアル作成
var _color:uint = Math.random() * 0x1000000;
var material:ColorMaterial = new ColorMaterial(_color, 0.5);
material.doubleSided = true; //裏面表示
material.interactive = true; // クリックイベント
// 平面オブジェクトを作成
pla = new Plane(material, 50, 50, 2, 2);
pla.extra = i;
pla.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, _Click);
pla.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, _Over);
pla.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, _Out);
scene.addChild(pla); // 平面を表示(addChild)
_plaArr[ i ] = pla; // 配列に参照の保存
}
// カメラの座標
camera.x = 0;
camera.y = 0;
camera.z = -camera.focus * camera.zoom;
_expObj(0);
addEventListener(Event.ENTER_FRAME, _EnterFrame);
}
/*----------------------------------------------------------------
☆ 展開 (_expObj)
----------------------------------------------------------------*/
private function _expObj(id:uint):void {
for (var i:uint = 0; i < MAX_pla; i++) {
// 角度からラジアンに返還する
var ele:Number = i - id;
var a_rot:Number = ( ele / MAX_pla) * 360; // 角度を設定
var a_rad:Number = a_rot * Math.PI / 180; // ラジアンを設定
var radius:int = 100; // 半径
var cenX:int = 0; // 円の中心X座標
var cenY:int = 0; // 円の中心Y座標
// 円周上に_plaArrを配置。
var a_PointX = Math.sin(a_rad) * radius + cenX;
var a_PointY = Math.cos(a_rad) * radius + cenY;
// 1.6秒で位置をアニメーション
Tweener.addTween(_plaArr[ i ], {
x: a_PointX,
y: a_PointY,
time: 1.6
});
}
}
/*----------------------------------------------------------------
☆イベント
----------------------------------------------------------------*/
// ENTER_FRAMEイベント
function _EnterFrame(e){
startRendering(); // 通常レンダリング
}
// Clickイベント
function _Click(e){
var nextId:int = e.currentTarget.extra; // Plaのextraプロパティを取得
_expObj(nextId); // ☆ 展開 (_expObj)へ
}
// Overイベント
function _Over(e){
buttonMode = true;
}
// OUTイベント
function _Out(e){
buttonMode = false;
}
}
}
----------------