static VtVec3fArray _GenerateConeMeshPoints(float radius, float height, TfToken const & axis) { // choose basis vectors aligned with the spine axis GfVec3f u, v, spine; if (axis == UsdGeomTokens->x) { u = GfVec3f::YAxis(); v = GfVec3f::ZAxis(); spine = GfVec3f::XAxis(); } else if (axis == UsdGeomTokens->y) { u = GfVec3f::ZAxis(); v = GfVec3f::XAxis(); spine = GfVec3f::YAxis(); } else { // (axis == UsdGeomTokens->z) u = GfVec3f::XAxis(); v = GfVec3f::YAxis(); spine = GfVec3f::ZAxis(); } // compute a ring of points with unit radius in the uv plane std::vector<GfVec3f> ring(_slices); for (int i=0; i<_slices; ++i) { float a = float(2 * M_PI * i) / _slices; ring[i] = u * cosf(a) + v * sinf(a); } int numPoints = _slices * (_stacks + 1 + 1) + 1; // populate points VtVec3fArray pointsArray(numPoints); GfVec3f * p = pointsArray.data(); // base cap *p++ = spine * -height/2.0f; for (int j=0; j<_slices; ++j) { *p++ = radius * ring[j] + spine * -height/2.0f; } // cone for (int i=0; i<=_stacks; ++i) { float t = float(i) / _stacks; float r = radius * (1.0f - t); float w = height * (t - 0.5f); for (int j=0; j<_slices; ++j) { *p++ = r * ring[j] + spine * w; } } TF_VERIFY(p - pointsArray.data() == numPoints); return pointsArray; }
static VtVec3fArray _GenerateCapsuleMeshPoints(float radius, float height, TfToken const & axis) { // choose basis vectors aligned with the spine axis GfVec3f u, v, spine; if (axis == UsdGeomTokens->x) { u = GfVec3f::YAxis(); v = GfVec3f::ZAxis(); spine = GfVec3f::XAxis(); } else if (axis == UsdGeomTokens->y) { u = GfVec3f::ZAxis(); v = GfVec3f::XAxis(); spine = GfVec3f::YAxis(); } else { // (axis == UsdGeomTokens->z) u = GfVec3f::XAxis(); v = GfVec3f::YAxis(); spine = GfVec3f::ZAxis(); } // compute a ring of points with unit radius in the uv plane std::vector<GfVec3f> ring(_slices); for (int i=0; i<_slices; ++i) { float a = float(2 * M_PI * i) / _slices; ring[i] = u * cosf(a) + v * sinf(a); } int numPoints = _slices * (_stacks + 1) // cylinder + 2 * _slices * (_hemisphereStacks-1) // hemispheres + 2; // end points // populate points VtVec3fArray pointsArray(numPoints); GfVec3f * p = pointsArray.data(); // base hemisphere *p++ = spine * (-height/2-radius); for (int i=0; i<_hemisphereStacks-1; ++i) { float a = float(M_PI / 2) * (1.0f - float(i+1) / _hemisphereStacks); float r = radius * cosf(a); float w = radius * sinf(a); for (int j=0; j<_slices; ++j) { *p++ = r * ring[j] + spine * (-height/2-w); } } // middle for (int i=0; i<=_stacks; ++i) { float t = float(i) / _stacks; float w = height * (t - 0.5f); for (int j=0; j<_slices; ++j) { *p++ = radius * ring[j] + spine * w; } } // top hemisphere for (int i=0; i<_hemisphereStacks-1; ++i) { float a = float(M_PI / 2) * (float(i+1) / _hemisphereStacks); float r = radius * cosf(a); float w = radius * sinf(a); for (int j=0; j<_slices; ++j) { *p++ = r * ring[j] + spine * (height/2+w); } } *p++ = spine * (height/2.0f+radius); TF_VERIFY(p - pointsArray.data() == numPoints); return pointsArray; }