1

ルックアップ テーブルに 3D ポイントを入力して 3D デモを最適化しようとしています (Vector 3D http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Vector3D.html )。後でアクセスします。

これらの 3D ポイントは、3D 空間でランダムでループ可能なパスを定義します。

これを達成する方法を知っている人はいますか?

Greensock Bezier トゥイーンを変更して 3D 空間でベジェを作成し、結果のトゥイーンの xyz 値を何らかの方法で取得することを考えていました。

4

1 に答える 1

3

次の 2 つのことを行う必要があります。

  1. 複数のフラグメントからループ 3D キュービック ベジェ カーブを作成する

  2. オブジェクトをターゲット、ベジエ ループをパス、合計ループ時間を取得するカスタム トゥイーン関数を作成します。

3 次ベジエ曲線の 1 つのフラグメントは常に 4 つの頂点を取り、完全なループには少なくとも 2 つのセグメントが含まれている必要があるため、少なくとも 7 つの頂点をランダムに作成する必要があります。頂点の数は常に になりますが、最初の頂点が最後の頂点と等しくなるように3 * NumberOfSegments + 1保存します3 * NumberOfSegments

最も単純なケース (2 つのセグメント、6 つの頂点):

...
private function generateRandomPoints():Vector<Vector3D>
{
    var resultingVector:Vector<Vector3D> = new Vector<Vector3D>();
    for(var i:int = 0; i < 6; i++)
    {
        var x:Number = Math.random() * 10;
        var y:Number = Math.random() * 10;
        var z:Number = Math.random() * 10;
        var currentPoint3D:Vector3D = new Vector3D(x, y, z);
        resultingVector.push(currentPoint3D);
    }
    return resultingVector;
}
...

パスを取得したら、それを解析してこのトゥイーン効果を得ることができます。新しい座標が必要になるたびにこの関数を呼び出すか (ただし、最初の時間をどこかに保存する必要があります)、すべてを処理する tweener オブジェクトを作成することができます。最も基本的な例 - 自律機能を示します。

public static function getNextCoordinates(loopStartTime:int, totalLoopTime:int, path:Vector.<Vector3D>):Vector3D
    {
        var resultingPoint:Vector3D = new Vector3D();
        var passedTime:int = getTimer() - loopStartTime;

        //Total passed ratio
        var passedRatio:Number = passedTime / totalLoopTime;
        var totalSegments:int = path.length / 3;

        var totalTimePerSegment:Number = totalLoopTime / totalSegments;

        //So it can loop forever
        while (passedRatio > 1)
        {
            passedRatio -= 1;
        }
        //Let's find our current bezier curve segment number
        var currentSegment:int = Math.floor( passedRatio * totalSegments);
        var currentSegmentRatio:Number = (passedTime - currentSegment * totalTimePerSegment) / totalTimePerSegment;
        //It can be optimized here
        while (currentSegmentRatio > 1)
        {
            currentSegmentRatio -= 1;
        }

        var startingIndex:int = currentSegment * 3;
        //our four path vertices
        var point0:Vector3D = path[startingIndex];
        var point1:Vector3D = path[startingIndex + 1];
        var point2:Vector3D = path[startingIndex + 2];

        //if it's a last segment, we need to "connect" to the first vertex
        if (startingIndex + 3 >= path.length)
        {
            var point3:Vector3D = path[0];
        }
        else
        {
            point3 = path[startingIndex + 3];
        }
        //At last, we find our coordinates
        var tempRatio:Number = 1 - currentSegmentRatio;
        resultingPoint.x = tempRatio * tempRatio * tempRatio * point0.x + 3 * tempRatio * tempRatio * currentSegmentRatio * point1.x + 3 * tempRatio * currentSegmentRatio * currentSegmentRatio * point2.x + currentSegmentRatio * currentSegmentRatio * currentSegmentRatio * point3.x;
        resultingPoint.y = tempRatio * tempRatio * tempRatio * point0.y + 3 * tempRatio * tempRatio * currentSegmentRatio * point1.y + 3 * tempRatio * currentSegmentRatio * currentSegmentRatio * point2.y + currentSegmentRatio * currentSegmentRatio * currentSegmentRatio * point3.y;
        resultingPoint.z = tempRatio * tempRatio * tempRatio * point0.z + 3 * tempRatio * tempRatio * currentSegmentRatio * point1.z + 3 * tempRatio * currentSegmentRatio * currentSegmentRatio * point2.z + currentSegmentRatio * currentSegmentRatio * currentSegmentRatio * point3.z;

        return resultingPoint;
    }

この関数を拡張して、トゥイーン オブジェクトの一部にすることができます。2D 空間でテストしたところ、ランダムな複数セグメントのベジエ曲線に沿ってスプライトの動きを完全にループさせます

乾杯!

于 2013-09-30T16:28:49.283 に答える