flash on 2009-10-6
♥0 |
Line 59 |
Modified 2009-10-06 03:56:21 |
MIT License
archived:2017-03-20 01:07:12
ActionScript3 source code
/**
* Copyright bigfish ( http://wonderfl.net/user/bigfish )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/a1aR
*/
package {
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.geom.PerspectiveProjection;
import flash.geom.Vector3D;
import flash.geom.Utils3D;
import flash.display.Graphics;
import flash.display.Sprite;
public class SeaSnake extends Sprite {
//todo - give fixed length
private var vertices:Vector.<Number> = Vector.<Number>([]);
//private var indices:Vector.<int> = Vector.<int>([]);
private var uvts:Vector.<Number> = Vector.<Number>([]);
private var numSegs:int = 50;
private var spine:Vector.<Vector3D> = new Vector.<Vector3D>(numSegs);
private var segDir:Vector3D ;
private var segLength:Number = 10;
private var projMatrix:Matrix3D;
private var perspective:PerspectiveProjection;
private var yR:Number = 0;
public function SeaSnake() {
init();
}
/**
* construct model of snake
*/
private function init():void
{
var startPoint:Vector3D = new Vector3D(0, 0, 100);
//spine point initially is the same as start point
var spinePoint:Vector3D = startPoint.clone();
//start with a random vector (in radians)
//segDir = new Vector3D(Math.random(), Math.random(), Math.random());
perspective = new PerspectiveProjection();
projMatrix = perspective.toMatrix3D();
for(var s:int = 0; s < numSegs; ++s)
{
//get next spine point
//var nextSpinePoint:Vector3D = getNextSpinePoint(spinePoint);
var newDir:Vector3D = new Vector3D(Math.random()*segLength, Math.random()*segLength, Math.random()*segLength);
spinePoint = spinePoint.add(newDir);
trace(spinePoint);
vertices.push(spinePoint.x, spinePoint.y, spinePoint.z);
}
/**
* getNextSpinePoint - move ahead by fixed length (spineSegLength) in a restricted random motion
* (continuing more or less same direction as previous segment)
*/
addEventListener(Event.ENTER_FRAME, onEnterFrame);
//render();
}
private function onEnterFrame(event:Event):void {
yR+=0.1;
if(yR >= 360)
yR = 0;
render();
}
/**
* render - draw spine .. later: flesh out
*/
private function render():void
{
var vout:Vector.<Number> = new Vector.<Number>();
projMatrix.prependRotation(yR, new Vector3D(0,1,0));
//projMatrix.prependTranslation(0,0,100);
//projMatrix.transformVectors(vertices, vout);
Utils3D.projectVectors(projMatrix, vertices, vout, new Vector.<Number>());
var g:Graphics = graphics;
//draw
var numVertices:Number = vertices.length/3;
var commands:Vector.<int> = new Vector.<int>(numVertices/2);
g.clear();
g.lineStyle(1,0x000000);
for(var p:int = 0; p < vout.length -2; p+=3)
{
g.lineTo(vout[p], vout[p+1]);
}
}
}
}