//sphere // mesh modeling // Gouraud shading // T. Kosaka CS TNCT 8Aug2002 #include #include #include #include "drawtools3D.h" #ifndef M_PI #define M_PI 3.141592653589793 #endif #define MAXSIZE 8192 void userdraw(void); void display(void) { glClear( GL_COLOR_BUFFER_BIT); userdraw(); glutSwapBuffers(); } ////////////////////////////////////////////////////////////////// void drawcharX(float x,float y) { drawLine(x,y,x+10,y+12);drawLine(x,y+12,x+10,y); } void drawcharY(float x,float y) { drawLine(x+5,y,x+5,y+7);drawLine(x,y+12,x+5,y+7);drawLine(x+10,y+12,x+5,y+7); } void drawcharZ(float x,float y) { drawLine(x,y+12,x+10,y+12);drawLine(x+10,y+12,x,y);drawLine(x,y,x+10,y); } void drawAxes(matrix3D_t view) { #define HALFAXIS 220 #define HALFAXIS1 (HALFAXIS-10) point3D_t axes[14]={ {-HALFAXIS,0,0},{HALFAXIS,0,0},{HALFAXIS1,5,0},{HALFAXIS1,0,0},{0,0,0}, {0,-HALFAXIS,0},{0,HALFAXIS,0},{0,HALFAXIS1,5},{0,HALFAXIS1,0},{0,0,0}, {0,0,-HALFAXIS},{0,0,HALFAXIS},{5,0,HALFAXIS1},{0,0,HALFAXIS1} }; vector3D_t vec[14]; int i; for (i=0;i<14;i++) { vec[i]=Point2Vector(axes[i]); vec[i]=view*vec[i]; } drawPolyline(vec,14); drawcharX(vec[1].v[0],vec[1].v[1]); drawcharY(vec[6].v[0],vec[6].v[1]); drawcharZ(vec[11].v[0]-14,vec[11].v[1]); } ////////////////////////////////////////////////////////////////// typedef struct { int NumberofVertices; //in the face short int pnt[8]; } face_t; typedef struct { int NumberofVertices; //of the object point3D_t pnt[MAXSIZE]; vector3D_t NormalVector[MAXSIZE]; // at the pnt int NumberofFaces; //of the object face_t fc[MAXSIZE]; } smoothpolyhedron_t; static void makeSphere(smoothpolyhedron_t &sphere,float r) { // r : radius of the sphere //球の赤道面はxz平面上にあり,北極はy軸上(+方向)にあり, //南極はy軸上(−方向)にある float latitude; /*緯度(赤道面から上方向が+)*/ float longitude; /*経度(x軸方向が0で北極から見て反時計回りが+)*/ int NumLatEdge=18; /*経度方向分割数(線の数(=点の数−1))*/ int NumLngEdge=32; /*緯度方向分割数(線の数(=点の数))*/ int i,j,k; vector3D_t unitz={0,0,1,1}; /*z方向単位ベクトル*/ vector3D_t unityn={0,1,0,1}; /*y方向+(北極方向)*/ vector3D_t unitys={0,-1,0,1}; /*y方向−(南極方向)単位ベクトル*/ matrix3D_t mat; //球(見かけ上の球)を構成する頂点の数 sphere.NumberofVertices=1+(NumLatEdge-1)*NumLngEdge+1; //頂点の座標とその頂点における法線ベクトルの定義 sphere.NormalVector[0]=unityn; //点番号0(北極点)における法線ベクトル sphere.pnt[0]=Vector2Point(r*sphere.NormalVector[0]);//点番号0の点の座標(北極点) for(i=1;i