void truncated_cone(const Mat4x4f& m, float l, float w0, float w1, vector<Vec3f>& strip) { float len = sqrt(l*l + sqr(w0-w1)); float a = l/len; float b = (w0-w1)/len; const int N = 10; for(int i=0;i<=N;++i) { float alpha = 2.0*M_PI*float(i)/N; Vec3f p0 = m.mul_3D_point(Vec3f(w0*cos(alpha), w0*sin(alpha), 0)); Vec3f p1 = m.mul_3D_point(Vec3f(w1*cos(alpha), w1*sin(alpha), l)); Vec3f n = m.mul_3D_vector(a*Vec3f(cos(alpha), sin(alpha), b)); if(i==0){ strip.push_back(n); strip.push_back(p0); } strip.push_back(n); strip.push_back(p0); strip.push_back(n); strip.push_back(p1); if(i==N){ strip.push_back(n); strip.push_back(p1); } } }
// Produce the mesh for a truncated cone void truncated_cone(const Mat4x4f& m, // transformation matrix used for the points float l, // length of truncated cone float w0, // width at base float w1, // width at top vector<Vec3f>& triangles, // triangles (out) vector<Vec3f>& normals) // normals (out) { float len = sqrt(l*l + sqr(w0-w1)); float a = l/len; float b = (w0-w1)/len; const int N = 10; for(int i=0;i<=N;++i) { float alpha = 2.0*M_PI*float(i)/N; Vec3f p0 = m.mul_3D_point(Vec3f(w0*cos(alpha), w0*sin(alpha), 0)); Vec3f p1 = m.mul_3D_point(Vec3f(w1*cos(alpha), w1*sin(alpha), l)); Vec3f n0 = m.mul_3D_vector(a*Vec3f(cos(alpha), sin(alpha), b)); Vec3f n1 = n0; alpha = 2.0*M_PI*float(i+1)/N; Vec3f p2 = m.mul_3D_point(Vec3f(w0*cos(alpha), w0*sin(alpha), 0)); Vec3f p3 = m.mul_3D_point(Vec3f(w1*cos(alpha), w1*sin(alpha), l)); Vec3f n2 = m.mul_3D_vector(a*Vec3f(cos(alpha), sin(alpha), b)); Vec3f n3 = n2; normals.push_back(n0); triangles.push_back(p0); normals.push_back(n1); triangles.push_back(p1); normals.push_back(n3); triangles.push_back(p3); normals.push_back(n3); triangles.push_back(p3); normals.push_back(n2); triangles.push_back(p2); normals.push_back(n0); triangles.push_back(p0); } }