Пример #1
0
VRGeometryPtr loadPly(string filename) {
    GeoUInt8PropertyRecPtr      Type = GeoUInt8Property::create();
    GeoUInt32PropertyRecPtr     Length = GeoUInt32Property::create();
    GeoPnt3fPropertyRecPtr      Pos = GeoPnt3fProperty::create();
    GeoVec3fPropertyRecPtr      Norms = GeoVec3fProperty::create();
    GeoVec3fPropertyRecPtr      Cols = GeoVec3fProperty::create();
    GeoUInt32PropertyRecPtr     Indices = GeoUInt32Property::create();
    SimpleMaterialRecPtr        Mat = SimpleMaterial::create();
    GeoVec2fPropertyRecPtr      Tex = GeoVec2fProperty::create();

    Mat->setLit(false);
    Mat->setDiffuse(Color3f(0.8,0.8,0.6));
    Mat->setAmbient(Color3f(0.4, 0.4, 0.2));
    Mat->setSpecular(Color3f(0.1, 0.1, 0.1));

    ifstream file(filename.c_str());
    string line;
    list<element> elements;
    while (getline(file, line)) {
        if (line == "end_header") break;
        auto data = splitString(line, ' ');
        if (data[0] == "element") elements.push_back( element(data[1], toInt(data[2]) ) );
        if (data[0] == "property") {
            if (data.size() == 3) elements.back().properties.push_back( property(data[1], data[2]) );
            else elements.back().properties.push_back( property(data[1], data[2]) );
        }
    }

    int N = 0;
    for (auto e : elements) N += e.N;
    VRProgress progress("load PLY " + filename, N);

    for (auto e : elements) {
        if (e.type == "vertex") {
            Vec3f p, n;
            Vec3i c;
            Vec2f t;
            bool doP = 0, doN = 0, doC = 0, doT = 0;
            for (int i=0; i<e.N; i++) {
                progress.update(1);
                getline(file, line);
                istringstream iss(line);
                for (auto prop : e.properties) {
                    if (prop.name == "x") { iss >> p[0]; doP = 1; }
                    if (prop.name == "y") { iss >> p[1]; doP = 1; }
                    if (prop.name == "z") { iss >> p[2]; doP = 1; }
                    if (prop.name == "nx") { iss >> n[0]; doN = 1; }
Пример #2
0
/** Create a mesh using vectors with positions, normals, indices && optionaly texture coordinates **/
void VRGeometry::create(int type, vector<Vec3f> pos, vector<Vec3f> norms, vector<int> inds, vector<Vec2f> texs) {
    bool doTex = (texs.size() == pos.size());

    GeoUInt8PropertyRecPtr      Type = GeoUInt8Property::create();
    GeoUInt32PropertyRecPtr     Length = GeoUInt32Property::create();
    GeoPnt3fPropertyRecPtr      Pos = GeoPnt3fProperty::create();
    GeoVec3fPropertyRecPtr      Norms = GeoVec3fProperty::create();
    GeoUInt32PropertyRecPtr     Indices = GeoUInt32Property::create();
    SimpleMaterialRecPtr        Mat = SimpleMaterial::create();
    GeoVec2fPropertyRecPtr      Tex = 0;
    if (doTex) Tex = GeoVec2fProperty::create();


    Type->addValue(type);
    Length->addValue(inds.size());

    //positionen und Normalen
    for(uint i=0;i<pos.size();i++) {
            Pos->addValue(pos[i]);
            Norms->addValue(norms[i]);
            if (doTex) Tex->addValue(texs[i]);
    }

    for(uint i=0;i<inds.size();i++) {
            Indices->addValue(inds[i]);
    }

    Mat->setDiffuse(Color3f(0.8,0.8,0.6));
    Mat->setAmbient(Color3f(0.4, 0.4, 0.2));
    Mat->setSpecular(Color3f(0.1, 0.1, 0.1));

    GeometryRecPtr geo = Geometry::create();
    geo->setTypes(Type);
    geo->setLengths(Length);
    geo->setIndices(Indices);
    geo->setPositions(Pos);
    geo->setNormals(Norms);
    if (doTex) geo->setTexCoords(Tex);
    geo->setMaterial(Mat);

    setMesh(geo);
}
Пример #3
0
void VRBlinds::create() {
    vector<Vec3f> norms;
    vector<int> inds;
    vector<Vec2f> texs;

    for (int i=0;i<20;i++) {//20 blend elements
        bl_pos_closed.push_back(Vec3f(0.55, -0.07*i, 0));
        bl_pos_closed.push_back(Vec3f(0.55, -0.07*(i+0.3), -0.04));
        bl_pos_closed.push_back(Vec3f(0.55, -0.07*(i+0.9), -0.08));

        bl_pos_closed.push_back(Vec3f(-0.55, -0.07*(i+0.9), -0.08));
        bl_pos_closed.push_back(Vec3f(-0.55, -0.07*(i+0.3), -0.04));
        bl_pos_closed.push_back(Vec3f(-0.55, -0.07*i, 0));

        bl_pos_open.push_back(Vec3f(0.55, -0.01*i, 0));
        bl_pos_open.push_back(Vec3f(0.55, -0.01*(i-0.7), -0.05));
        bl_pos_open.push_back(Vec3f(0.55, -0.01*i, -0.1));

        bl_pos_open.push_back(Vec3f(-0.55, -0.01*i, -0.1));
        bl_pos_open.push_back(Vec3f(-0.55, -0.01*(i-0.7), -0.05));
        bl_pos_open.push_back(Vec3f(-0.55, -0.01*i, 0));

        inds.push_back(i*6+0);//quad1
        inds.push_back(i*6+1);//quad1
        inds.push_back(i*6+4);//quad1
        inds.push_back(i*6+5);//quad1

        for (int j=1;j<5;j++) inds.push_back(i*6+j);//quad2

        for (int j=0;j<6;j++) norms.push_back(Vec3f(0,1,0));

        texs.push_back(Vec2f(1,0));
        texs.push_back(Vec2f(1,0.5));
        texs.push_back(Vec2f(1,1));

        texs.push_back(Vec2f(0,1));
        texs.push_back(Vec2f(0,0.5));
        texs.push_back(Vec2f(0,0));
    }


    blend_geo = new VRGeometry("blend");
    blend_geo->create(GL_QUADS, bl_pos_open, norms, inds, texs);

    Vec3f pos = window->getGeometricCenter();
    Vec3f norm = window->getAverageNormal();
    norm.normalize();
    pos[2] = window->getMax(2);

    Matrix m = window->getWorldMatrix();
    m.mult(pos, pos);
    m.mult(norm, norm);

    blend_geo->setPose(pos, pos + norm, Vec3f(0,1,0));
    scene->add(blend_geo);

    SimpleMaterialRecPtr mat = SimpleMaterial::create();
    mat->setDiffuse(Color3f(0.5,0.5,0.5));
    mat->setAmbient(Color3f(0.2, 0.2, 0.2));
    mat->setSpecular(Color3f(0.1, 0.1, 0.1));

    blend_geo->setMaterial(mat);
}