00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "Teddy/Models/Capsule.h"
00026 #include "Teddy/Models/QuadStrip.h"
00027 #include "Teddy/Models/Vertex.h"
00028 #include "Teddy/SysSupport/StdMaths.h"
00029
00030
00031 namespace Teddy {
00032 namespace Models {
00033
00034
00044 Capsule::Capsule(
00045 const std::string &name,
00046 const double len,
00047 const double rad,
00048 const int stacks,
00049 const int slices
00050 )
00051 :Model( name ){
00052
00053 double r;
00054 double x;
00055 double y;
00056 double z;
00057 int i;
00058 int j;
00059 int k;
00060
00061 this->radius = rad;
00062 this->stacks = stacks;
00063 this->slices = slices;
00064
00065 for( j=0; j<stacks/2; j++ ){
00066 QuadStrip *qs = new QuadStrip();
00067 for( i=0; i<slices+1; i++ ){
00068 for( k=0; k<2; k++ ){
00069 z = radius*cos( (j+k)*M_PI/stacks );
00070 r = radius*sin( (j+k)*M_PI/stacks );
00071 y = r*cos( i*M_2_PI/slices );
00072 x = r*sin( i*M_2_PI/slices );
00073 Vertex *v = new Vertex( x, y, z + len/2 );
00074 Vector normal = Vector( x, y, z );
00075 normal.normalize();
00076 v->setNormal( normal );
00077 qs->add( v );
00078 }
00079 }
00080 add( qs );
00081 }
00082
00083 j=stacks/2;
00084
00085 QuadStrip *qs = new QuadStrip();
00086 for( i=0; i<slices+1; i++ ){
00087 for( k=0; k<2; k++ ){
00088 z = radius*cos( (j)*M_PI/stacks );
00089 r = radius*sin( (j)*M_PI/stacks );
00090 y = r*cos( i*M_2_PI/slices );
00091 x = r*sin( i*M_2_PI/slices );
00092 Vertex *v = new Vertex( x, y, z + len/2 - (k * len) );
00093 Vector normal = Vector( x, y, z );
00094 normal.normalize();
00095 v->setNormal( normal );
00096 qs->add( v );
00097 }
00098 }
00099 add( qs );
00100
00101 for( j=stacks/2; j<stacks; j++ ){
00102 QuadStrip *qs = new QuadStrip();
00103 for( i=0; i<slices+1; i++ ){
00104 for( k=0; k<2; k++ ){
00105 z = radius*cos( (j+k)*M_PI/stacks );
00106 r = radius*sin( (j+k)*M_PI/stacks );
00107 y = r*cos( i*M_2_PI/slices );
00108 x = r*sin( i*M_2_PI/slices );
00109 Vertex *v = new Vertex( x, y, z - len/2 );
00110 Vector normal = Vector( x, y, z );
00111 normal.normalize();
00112 v->setNormal( normal );
00113 qs->add( v );
00114 }
00115 }
00116 add( qs );
00117 }
00118
00119 setupClipRadius();
00120 }
00121
00122
00123 };
00124 };
00125
00126