我想通过填充查找表与3D点(矢量3D来优化3D演示http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Vector3D.html ),我然后将访问以后。
这些3D点将定义在三维空间中随机和路径加入影片箱。
有谁知道实现这一目标的一种方式?
我想修改使用GreenSock贝塞尔补间创建3D空间中的贝塞尔,然后以某种方式抓住导致吐温的XYZ值。
我想通过填充查找表与3D点(矢量3D来优化3D演示http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Vector3D.html ),我然后将访问以后。
这些3D点将定义在三维空间中随机和路径加入影片箱。
有谁知道实现这一目标的一种方式?
我想修改使用GreenSock贝塞尔补间创建3D空间中的贝塞尔,然后以某种方式抓住导致吐温的XYZ值。
好吧,你需要做两件事情:
从创建几个片段成环的3D三次Bezier曲线
创建,将你的对象作为一个目标,你的贝塞尔环路的路径和您的总循环时间的自定义补间功能。
您三次Bezier曲线的一个片段将始终以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;
}
...
现在,当我们有我们的道路上,我们可以分析它来获得这种渐变效果。 您可以调用这个函数每次你需要新坐标(但你需要在一些地方保存你的初始时间),或创建一个中间人的对象将处理你的一切。 我会告诉最基本的例子 - 自治功能:
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;
}
您可以扩展这个功能是补间对象的一部分。 我在二维空间的测试,它完美的循环沿随机多段Bezier曲线精灵的运动
干杯!