/// See http://paulbourke.net/geometry/platonic/ Polyhedron Polyhedron::Tetrahedron(const float3 ¢erPos, float scale, bool ccwIsFrontFacing) { const float3 vertices[4] = { float3(1,1,1), float3(-1,1,-1), float3(1,-1,-1), float3(-1,-1,1) }; const int faces[4][3] = { { 0, 1, 2 }, { 1, 3, 2 }, { 0, 2, 3 }, { 0, 3, 1 } }; scale /= 2.f; Polyhedron p; for(int i = 0; i < 4; ++i) p.v.push_back(vertices[i]*scale + centerPos); for(int i = 0; i < 4; ++i) { Face f; for(int j = 0; j < 3; ++j) f.v.push_back(faces[i][j]); p.f.push_back(f); } if (!ccwIsFrontFacing) p.FlipWindingOrder(); return p; }
/// See http://paulbourke.net/geometry/platonic/ Polyhedron Polyhedron::Dodecahedron(const float3 ¢erPos, float scale, bool ccwIsFrontFacing) { float phi = (1.f + Sqrt(5.f)) / 2.f; float b = 1.f / phi; float c = 2.f - phi; const float3 vertices[20] = { float3( c, 0, 1), float3(-c, 0, 1), float3(-b, b, b), float3( 0, 1, c), float3( b, b, b), float3( b, -b, b), float3( 0, -1, c), float3(-b, -b, b), float3( 0, -1, -c), float3( b, -b, -b), float3(-c, 0, -1), float3( c, 0, -1), float3(-b, -b, -b), float3( b, b, -b), float3( 0, 1, -c), float3(-b, b, -b), float3( 1, c, 0), float3(-1, c, 0), float3(-1, -c, 0), float3( 1, -c, 0) }; const int faces[12][5] = { { 0, 1, 2, 3, 4 }, { 1, 0, 5, 6, 7 }, { 11, 10, 12, 8, 9 }, { 10, 11, 13, 14, 15 }, { 13, 16, 4, 3, 14 }, // Note: The winding order of this face was flipped from PBourke's original representation. { 2, 17, 15, 14, 3 }, // Winding order flipped. { 12, 18, 7, 6, 8 }, // Winding order flipped. { 5, 19, 9, 8, 6 }, // Winding order flipped. { 16, 19, 5, 0, 4 }, { 19, 16, 13, 11, 9 }, { 17, 18, 12, 10, 15 }, { 18, 17, 2, 1, 7 } }; scale /= 2.f; Polyhedron p; for(int i = 0; i < 20; ++i) p.v.push_back(vertices[i]*scale + centerPos); for(int i = 0; i < 12; ++i) { Face f; for(int j = 0; j < 5; ++j) f.v.push_back(faces[i][j]); p.f.push_back(f); } if (!ccwIsFrontFacing) p.FlipWindingOrder(); return p; }
/// See http://paulbourke.net/geometry/platonic/ Polyhedron Polyhedron::Icosahedron(const float3 ¢erPos, float scale, bool ccwIsFrontFacing) { float a = 0.5f; float phi = (1.f + Sqrt(5.f)) / 2.f; float b = 1.f / (2.f * phi); const float3 vertices[12] = { float3( 0, b, -a), float3( b, a, 0), float3(-b, a, 0), float3( 0, b, a), float3( 0, -b, a), float3(-a, 0, b), float3( a, 0, b), float3( 0, -b, -a), float3(-a, 0, -b), float3(-b, -a, 0), float3( b, -a, 0), float3( a, 0, -b) }; const int faces[20][3] = { { 0, 1, 2 }, { 3, 2, 1 }, { 3, 4, 5 }, { 3, 6, 4 }, { 0, 7, 11 }, { 0, 8, 7 }, { 4, 10, 9 }, { 7, 9, 10 }, { 2, 5, 8 }, { 9, 8, 5 }, { 1, 11, 6 }, { 10, 6, 11 }, { 3, 5, 2 }, { 3, 1, 6 }, { 0, 2, 8 }, { 0, 11, 1 }, { 7, 8, 9 }, { 7, 10, 11 }, { 4, 9, 5 }, { 4, 6, 10 } }; Polyhedron p; for(int i = 0; i < 12; ++i) p.v.push_back(vertices[i]*scale + centerPos); for(int i = 0; i < 20; ++i) { Face f; for(int j = 0; j < 3; ++j) f.v.push_back(faces[i][j]); p.f.push_back(f); } if (!ccwIsFrontFacing) p.FlipWindingOrder(); return p; }
/// See http://paulbourke.net/geometry/platonic/ Polyhedron Polyhedron::Hexahedron(const float3 ¢erPos, float scale, bool ccwIsFrontFacing) { AABB aabb(float3(-1,-1,-1), float3(1,1,1)); aabb.Scale(float3::zero, scale * 0.5f); aabb.Translate(centerPos); Polyhedron p = aabb.ToPolyhedron(); if (ccwIsFrontFacing) p.FlipWindingOrder(); return p; }
/// See http://paulbourke.net/geometry/platonic/ Polyhedron Polyhedron::Octahedron(const float3 ¢erPos, float scale, bool ccwIsFrontFacing) { float a = 1.f / (2.f * Sqrt(2.f)); float b = 0.5f; const float3 vertices[6] = { float3(-a, 0, a), float3(-a, 0,-a), float3( 0, b, 0), float3( a, 0,-a), float3( 0,-b, 0), float3( a, 0, a) }; const int faces[8][3] = { { 0, 1, 2 }, { 1, 3, 2 }, { 3, 5, 2 }, { 5, 0, 2 }, { 3, 1, 4 }, { 1, 0, 4 }, { 5, 3, 4 }, { 0, 5, 4 } }; scale /= 2.f; Polyhedron p; for(int i = 0; i < 6; ++i) p.v.push_back(vertices[i]*scale + centerPos); for(int i = 0; i < 8; ++i) { Face f; for(int j = 0; j < 3; ++j) f.v.push_back(faces[i][j]); p.f.push_back(f); } if (!ccwIsFrontFacing) p.FlipWindingOrder(); return p; }