package org.papervision3d.objects.primitives { import org.papervision3d.Papervision3D; import org.papervision3d.core.geom.*; import org.papervision3d.core.geom.renderables.Triangle3D; import org.papervision3d.core.geom.renderables.Vertex3D; import org.papervision3d.core.math.NumberUV; import org.papervision3d.core.proto.*; /** * The Sphere class lets you create and display spheres. *
* The sphere is divided in vertical and horizontal segment, the smallest combination is two vertical and three horizontal segments. */ public class Sphere extends TriangleMesh3D { /** * Number of segments horizontally. Defaults to 8. */ private var segmentsW :Number; /** * Number of segments vertically. Defaults to 6. */ private var segmentsH :Number; /** * Default radius of Sphere if not defined. */ static public var DEFAULT_RADIUS :Number = 100; /** * Default scale of Sphere texture if not defined. */ static public var DEFAULT_SCALE :Number = 1; /** * Default value of gridX if not defined. */ static public var DEFAULT_SEGMENTSW :Number = 8; /** * Default value of gridY if not defined. */ static public var DEFAULT_SEGMENTSH :Number = 6; /** * Minimum value of gridX. */ static public var MIN_SEGMENTSW :Number = 3; /** * Minimum value of gridY. */ static public var MIN_SEGMENTSH :Number = 2; // ___________________________________________________________________________________________________ // N E W // NN NN EEEEEE WW WW // NNN NN EE WW WW WW // NNNNNN EEEE WWWWWWWW // NN NNN EE WWW WWW // NN NN EEEEEE WW WW /** * Create a new Sphere object. * * @param material A MaterialObject3D object that contains the material properties of the object. * * @param radius [optional] - Desired radius. * * @param segmentsW [optional] - Number of segments horizontally. Defaults to 8. * * @param segmentsH [optional] - Number of segments vertically. Defaults to 6. * */ public function Sphere( material:MaterialObject3D=null, radius:Number=100, segmentsW:int=8, segmentsH:int=6 ) { super( material, new Array(), new Array(), null ); this.segmentsW = Math.max( MIN_SEGMENTSW, segmentsW || DEFAULT_SEGMENTSW); // Defaults to 8 this.segmentsH = Math.max( MIN_SEGMENTSH, segmentsH || DEFAULT_SEGMENTSH); // Defaults to 6 if (radius==0) radius = DEFAULT_RADIUS; // Defaults to 100 var scale :Number = DEFAULT_SCALE; buildSphere( radius ); } private function buildSphere( fRadius:Number ):void { var i:Number, j:Number, k:Number; var iHor:Number = Math.max(3,this.segmentsW); var iVer:Number = Math.max(2,this.segmentsH); var aVertice:Array = this.geometry.vertices; var aFace:Array = this.geometry.faces; var aVtc:Array = new Array(); for (j=0;j<(iVer+1);j++) { // vertical var fRad1:Number = Number(j/iVer); var fZ:Number = -fRadius*Math.cos(fRad1*Math.PI); var fRds:Number = fRadius*Math.sin(fRad1*Math.PI); var aRow:Array = new Array(); var oVtx:Vertex3D; for (i=0;i