/src/away3d/extrusions/utils/PathUtils.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 104 lines · 76 code · 25 blank · 3 comment · 8 complexity · 54e280dabdd6ea21dd7785ba7e28d5c9 MD5 · raw file

  1. package away3d.extrusions.utils
  2. {
  3. import flash.geom.Vector3D;
  4. /**
  5. * Geometry handlers for classes using Path objects
  6. */
  7. public class PathUtils{
  8. public static function step( startVal:Vector3D, endVal:Vector3D, subdivision:int):Vector.<Vector3D> {
  9. var vTween:Vector.<Vector3D> = new Vector.<Vector3D>();
  10. var stepx:Number = (endVal.x-startVal.x) / subdivision;
  11. var stepy:Number = (endVal.y-startVal.y) / subdivision;
  12. var stepz:Number = (endVal.z-startVal.z) / subdivision;
  13. var step:int = 1;
  14. var scalestep:Vector3D;
  15. while (step < subdivision) {
  16. scalestep = new Vector3D();
  17. scalestep.x = startVal.x+(stepx*step);
  18. scalestep.y = startVal.y+(stepy*step);
  19. scalestep.z = startVal.z+(stepz*step);
  20. vTween.push(scalestep);
  21. step ++;
  22. }
  23. vTween.push(endVal);
  24. return vTween;
  25. }
  26. public static function rotatePoint(aPoint:Vector3D, rotation:Vector3D):Vector3D
  27. {
  28. if(rotation.x !=0 || rotation.y != 0 || rotation.z != 0)
  29. {
  30. var x1:Number;
  31. var y1:Number;
  32. var rad:Number = Math.PI / 180;
  33. var rotx:Number = rotation.x * rad;
  34. var roty:Number = rotation.y * rad;
  35. var rotz:Number = rotation.z * rad;
  36. var sinx:Number = Math.sin(rotx);
  37. var cosx:Number = Math.cos(rotx);
  38. var siny:Number = Math.sin(roty);
  39. var cosy:Number = Math.cos(roty);
  40. var sinz:Number = Math.sin(rotz);
  41. var cosz:Number = Math.cos(rotz);
  42. var x:Number = aPoint.x;
  43. var y:Number = aPoint.y;
  44. var z:Number = aPoint.z;
  45. y1 = y;
  46. y = y1*cosx+z*-sinx;
  47. z = y1*sinx+z*cosx;
  48. x1 = x;
  49. x = x1*cosy+z*siny;
  50. z = x1*-siny+z*cosy;
  51. x1 = x;
  52. x = x1*cosz+y*-sinz;
  53. y = x1*sinz+y*cosz;
  54. aPoint.x = x;
  55. aPoint.y = y;
  56. aPoint.z = z;
  57. }
  58. return aPoint;
  59. }
  60. public static function getPointsOnCurve(path:Path, subdivision:uint):Vector.<Vector.<Vector3D>>
  61. {
  62. var segPts:Vector.<Vector.<Vector3D>> = new Vector.<Vector.<Vector3D>>();
  63. for (var i:uint = 0; i < path.length; ++i)
  64. segPts[i] = PathUtils.getSegmentPoints(path.segments[i].pStart, path.segments[i].pControl, path.segments[i].pEnd, subdivision, (i ==path.length-1));
  65. return segPts;
  66. }
  67. public static function getSegmentPoints(pStart:Vector3D, pControl:Vector3D, pEnd:Vector3D, n:uint, last:Boolean):Vector.<Vector3D>
  68. {
  69. var aPts:Vector.<Vector3D> = new Vector.<Vector3D>();
  70. for (var i:uint = 0; i < n+((last)? 1 : 0); ++i)
  71. aPts[i] = PathUtils.getNewPoint(pStart.x, pStart.y, pStart.z, pControl.x, pControl.y, pControl.z, pEnd.x, pEnd.y, pEnd.z, i / n);
  72. return aPts;
  73. }
  74. public static function getNewPoint(x0:Number = 0, y0:Number = 0, z0:Number=0, aX:Number = 0, aY:Number = 0, aZ:Number=0, x1:Number = 0, y1:Number = 0, z1:Number=0, t:Number = 0):Vector3D
  75. {
  76. return new Vector3D(x0 + t * (2 * (1 - t) * (aX - x0) + t * (x1 - x0)), y0 + t * (2 * (1 - t) * (aY - y0) + t * (y1 - y0)), z0 + t * (2 * (1 - t) * (aZ - z0) + t * (z1 - z0)));
  77. }
  78. }
  79. }