閃いたので書きなぐる。後でまとめる。実装するまでのドラフト
/*
* キモの部分。
* 細かい条件分岐などは割愛
* 以下全体を render で呼んどいてENTER_FRAME しとく
*/
// 現在の角度
var nDegree:Number = 現在の角度;
// 目標の角度
var dDegree:Number = 例えば45とか;
// 1フレームで回転する角度(その都度目的角度までの2/1度)
var rad:Number = ((dDegree - nDegree)/2)*Math.PI/180;
// 現在の座標
var pX:Number = camera.x;
var pZ:Number = camera.Z;
// 回転後の座標
camera.x = pX*Math.cos(rad) - pZ*Math.sin(rad);
camera.z = pZ*Math.cos(rad) + pX*Math.sin(rad);
無理かなぁ...
デザイン固まったら試す。
---------- 追記。 ----------
// 1フレームで回転する角度(その都度目的角度までの2/1度) var rad:Number = ((dDegree - nDegree)/2)*Math.PI/180;
これダメ。
処理がおっつかん。
というかそもそもなんか間違ってるんだろうな。
結局、目的の角度までまわして、目的の角度に達したら回るのやめ、ていう条件分岐の問題ですねこれ。てかカメラのまわし方くらいこないだ購入した Papervision3Dではじめる Flash3Dアニメーション に載ってるし。なんか調子こいてエントリ書いたのが情けなす。
とはいえ実装せんと仕事にならんので引き続き調べる。
---------- 追記。 ----------
camera.target = DisplayObject3D.ZERO
の状態で、ターゲットを中心に右だ左だ、と任意の角度までカメラを移動させたい。で、移動するスピードをイージングしたかったけど今の自分の数学力(算数力?)ではまだ無理。
ということで、camera は scene に設置された時点で 90° の位置にあり、左へ 90° 回転したあとは 0° スタートのマイナス角度になり、 右へ 90° 回転した後は 180° スタートのマイナス角度になる。(下図参照)

なので、例えば mode = " MOVE " の間だけ ENTER_FRAME が適用されるようにしておいて、その状態でカメラを等速度で回転させ、現在の角度( nDegree )の値が、目的の角度( dDegree )の値より大きくなったか小さくなったか、を判定して mode の値を " STOP " なりなんなり " MOVE " 以外に変更して、ENTER_FRAME を止める、と。
一番しあわせなのは、加法定理を Tweener に適用して、ぐりぐりイージングとか出来ることだけど、そんなのどうやって計算すればいいんだろう...。
勉強あるのみです。
ちなみに、カメラのその時の角度は次の関数呼べば角度で return されてきます。
private function cameraDegree():Number
{
var cameraXfromCenter:Number = 0 - camera.x;
var cameraZfromCenter:Number = 0 - camera.z;
var radian:Number = Math.atan2(cameraZfromCenter, cameraXfromCenter);
var degree:Number = radian * 180 / Math.PI;
return degree;
}
---------- 追記。 ----------
回転速度をイージングしようと思ったら、投げる rad を毎フレーム 0.5 とかかけて、徐々に減らしていけばいいのか。
---------- 追記。 ----------
イージング、実験成功。
注意すべきなのは、右回りにしろ左回りにしろ、上の図で180°地点を通過するとき。
成功した swf 貼りたいけど クライアントの許可おりないだろうから、また時間が出来たら再現 swf つくる(かもしれない)。

コメントする