示例#1
0
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;
}
示例#2
0
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;
}