00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "Sphere.h"
00013 #include "TriangleMesh.h"
00014 #include "xmath.h"
00015
00016
00017 namespace columbia
00018 {
00019
00020 void TriangulateSphere(TriangleMesh &msh, int depth)
00021 {
00022 const float X = .525731112119133606;
00023 const float Z = .850650808352039932;
00024 float vdata[12][3] = {
00025 {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z},
00026 {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X},
00027 {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0}
00028 };
00029 int tindices[20][3] = {
00030 {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},
00031 {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},
00032 {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
00033 {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };
00034
00035 msh.V.clear(), msh.N.clear(), msh.T.clear(), msh.F.clear();
00036
00037 for(int i=0; i<12; i++)
00038 {
00039 msh.V.push_back( Vertex(vdata[i][0], vdata[i][1], vdata[i][2]) );
00040 }
00041
00042 for(int i=0; i<20; i++)
00043 {
00044 msh.F.push_back( TriangleFace(tindices[i][0], tindices[i][1], tindices[i][2], -1, -1, -1, tindices[i][0], tindices[i][1], tindices[i][2]) );
00045 }
00046 for(int d=1; d<depth; d++)
00047 {
00048 int faces = msh.F.size();
00049 for(int f=0; f < faces; ++f)
00050 {
00051 int i = msh.F[0].i, j = msh.F[0].j, k = msh.F[0].k;
00052
00053 Vertex v1 = msh.V[i];
00054 Vertex v2 = msh.V[j];
00055 Vertex v3 = msh.V[k];
00056
00057 Vertex v12 = ((v1 + v2) / 2).GetUnit();
00058 Vertex v13 = ((v1 + v3) / 2).GetUnit();
00059 Vertex v23 = ((v3 + v2) / 2).GetUnit();
00060
00061 int ij = msh.V.size();
00062 msh.V.push_back(v12);
00063
00064 int ik = msh.V.size();
00065 msh.V.push_back(v13);
00066
00067 int jk = msh.V.size();
00068 msh.V.push_back(v23);
00069
00070 msh.F.erase( msh.F.begin() );
00071
00072 msh.F.push_back( TriangleFace(i, ik, ij, -1, -1, -1, i, ik, ij) );
00073 msh.F.push_back( TriangleFace(j, jk, ij, -1, -1, -1, j, jk, ij) );
00074 msh.F.push_back( TriangleFace(k, ik, jk, -1, -1, -1, k, ik, jk) );
00075 msh.F.push_back( TriangleFace(jk, ik,ij, -1, -1, -1, jk, ik,ij) );
00076 }
00077 }
00078 msh.N = msh.V;
00079 msh.init();
00080 }
00081
00082
00083 void ParametrizeSphere(TriangleMesh & msh, int slicesV, int slicesH)
00084 {
00085 msh.V.clear(), msh.N.clear(), msh.T.clear(), msh.F.clear();
00086
00087 double theta_step = pi / slicesV, theta = theta_step;
00088 msh.V.push_back( Vertex(0, -1, 0) );
00089 for(int i = 1; i < slicesV; ++i, theta += theta_step)
00090 {
00091 double phi = 0, phi_step = 2 * pi / slicesH;
00092
00093 for(int j = 0; j < slicesH; ++j, phi += phi_step)
00094 {
00095 msh.V.push_back( Vertex(sin(theta) * sin(phi-pi), -cos(theta), sin(theta) * cos(phi-pi) ) );
00096 msh.T.push_back( Vertex(phi / (2*pi), theta / pi) );
00097 }
00098 msh.T.push_back( Vertex(1.0, theta / pi) );
00099 }
00100 msh.V.push_back( Vertex(0, 1, 0) );
00101
00102
00103 for(int i=0; i<slicesV; ++i)
00104 {
00105 for(int j=0; j<slicesH; ++j)
00106 {
00107 int tex0 = i * (slicesH+1) + j;
00108 int tex1 = tex0 + 1;
00109 int tex2 = tex1 + (slicesH+1);
00110 int tex3 = tex2 - 1;
00111
00112 if(i==0)
00113 {
00114 msh.F.push_back( TriangleFace(0, j, j+1 == slicesH ? 0 : j+1,
00115 tex0, tex1, tex2,
00116 0, j, j+1 == slicesH ? 0 : j+1) );
00117 continue;
00118 }
00119
00120
00121
00122 int idx0 = 1 + (i-1) * slicesH + j;
00123 int idx1 = idx0 + 1;
00124 int idx2 = idx1 + slicesH;
00125 int idx3 = idx2 - 1;
00126
00127 if(i+1 == slicesV)
00128 {
00129 msh.F.push_back( TriangleFace(idx0, j+1 == slicesH ? msh.V.size() - slicesH - 1 : idx1, msh.V.size() - 1,
00130 tex0, tex1, tex2,
00131 idx0, j+1 == slicesH ? msh.V.size() - slicesH - 1 : idx1, msh.V.size() - 1) );
00132 continue;
00133 }
00134
00135 if(j+1 == slicesH)
00136 {
00137 idx1 = 1 + (i-1) * slicesH, idx2 = 1 + i * slicesH;
00138 }
00139
00140 msh.F.push_back( TriangleFace(idx0, idx1, idx2,
00141 tex0, tex1, tex2,
00142 idx0, idx1, idx2) );
00143
00144 msh.F.push_back( TriangleFace(idx0, idx2, idx3,
00145 tex0, tex2, tex3,
00146 idx0, idx2, idx3) );
00147 }
00148 }
00149
00150 msh.N = msh.V;
00151
00152 msh.init();
00153 }
00154
00155
00156 }