package com.dafishinsea.models { import flash.display.Sprite; import flash.events.Event; import flash.display.TriangleCulling; import flash.geom.PerspectiveProjection; import flash.geom.Utils3D; import flash.geom.Vector3D; import flash.geom.Matrix3D; public class Sphere extends Sprite { public var vertices:Vector.; public var indices:Vector.; public var uvtData:Vector.; public function Sphere(radius:Number, detail:Number) { vertices = new Vector.(); indices = new Vector.(); uvtData = new Vector.(); createSphere(radius, detail, detail); } private function createSphere(radius:Number, latspacing:int, longspacing:int):void { //sphere for(var lat:int = 0; lat <= 180; lat += latspacing){ for(var long:int = 0; long<= 360; long += longspacing){ //get x,y,z for the point at lat, long //x = r*cos(long)*sin(lat) //y = r*cos(lat) //z = r*sin(long)*sin(lat) var _x:Number = radius*Math.cos(long*Math.PI/180)*Math.sin(lat*Math.PI/180); var _y:Number = radius*Math.cos(lat*Math.PI/180); var _z:Number = radius*Math.sin(long*Math.PI/180)*Math.sin(lat*Math.PI/180); vertices.push(_x,_y,_z); uvtData.push(long/360,lat/180,1); } } //uvtData //OK, now for triangles var rows:Number = 180/latspacing; var cols:Number = 360/longspacing + 1; /* triangle arrangement i--------(i+1) | / | | / | | / | |/ | i2 ------(i2 +1) */ for(var row:int = 0; row < rows; row++){ for(var col:int = 0; col < cols; col++){ var i:int = row*(cols) + col; var i2:int = (row+1)*(cols) + col; if(col+1 != cols) { indices.push(i, i + 1, i2); indices.push(i2, i + 1, i2 + 1); } else { //last rectangle - back to start //indices.push(i, i - cols + 1, i2); //indices.push(i2, i - cols + 1, i2 - cols + 1); } } } } } }