コード例 #1
0
ファイル: camera_rig.cpp プロジェクト: Maginador/GearVRf
void CameraRig::setRotation(const glm::quat& transform_rotation) {
    // Get head transform (a child of camera rig object)
    Transform* transform = getHeadTransform();

    if (camera_rig_type_ == FREE) {
        transform->set_rotation(transform_rotation);
    } else if (camera_rig_type_ == YAW_ONLY) {
        glm::vec3 look_at = glm::rotate(transform_rotation,
                glm::vec3(0.0f, 0.0f, -1.0f));
        float yaw = atan2f(-look_at.x, -look_at.z) * 180.0f / M_PI;
        transform->set_rotation(
                glm::angleAxis(yaw, glm::vec3(0.0f, 1.0f, 0.0f)));
    } else if (camera_rig_type_ == ROLL_FREEZE) {
        glm::vec3 look_at = glm::rotate(transform_rotation,
                glm::vec3(0.0f, 0.0f, -1.0f));
        float pitch = atan2f(look_at.y,
                sqrtf(look_at.x * look_at.x + look_at.z * look_at.z)) * 180.0f
                / M_PI;
        float yaw = atan2f(-look_at.x, -look_at.z) * 180.0f / M_PI;
        transform->set_rotation(
                glm::angleAxis(pitch, glm::vec3(1.0f, 0.0f, 0.0f)));
        transform->rotateByAxis(yaw, 0.0f, 1.0f, 0.0f);
    } else if (camera_rig_type_ == FREEZE) {
        transform->set_rotation(glm::quat());
    } else if (camera_rig_type_ == ORBIT_PIVOT) {
        glm::vec3 pivot(getVec3("pivot"));
        transform->set_position(pivot.x, pivot.y,
                pivot.z + getFloat("distance"));
        transform->set_rotation(glm::quat());
        transform->rotateWithPivot(transform_rotation.w,
                transform_rotation.x, transform_rotation.y,
                transform_rotation.z, pivot.x, pivot.y, pivot.z);
    }
}
コード例 #2
0
ファイル: PerlinFace.cpp プロジェクト: heracek/hifi
void PerlinFace::init() {
    if (_initialized) {
        return;
    }
    glGenBuffers(1, &_vboID);
    glGenBuffers(1, &_nboID);
    glGenBuffers(1, &_cboID);

    _vertexNumber = sizeof(VERTICES) / (FLOAT_PER_VERTEX * sizeof(float));

    _oldNormals = new glm::vec3[_vertexNumber];
    _newNormals = new glm::vec3[_vertexNumber];

    if (_vertices == NULL) {
        _vertices = new glm::vec3[_vertexNumber];
        for (int i = 0; i < _vertexNumber; ++i) {
            _vertices[i] = getVec3(i);
        }

        _trianglesPos = _triangles = new GLfloat[FLOAT_PER_VERTEX * VERTEX_PER_TRIANGLE * TRIANGLES_NUMBER];
        _normalsPos = _normals = new GLfloat[FLOAT_PER_VERTEX * VERTEX_PER_TRIANGLE  * TRIANGLES_NUMBER];
        _colorsPos = _colors = new GLubyte[FLOAT_PER_VERTEX * VERTEX_PER_TRIANGLE  * TRIANGLES_NUMBER];

        atexit(staticCleanup);
    }

    _initialized = true;
}
コード例 #3
0
ファイル: scene.cpp プロジェクト: TTU-Graphics/FinalProject
InstanceModel* Scene::buildInstance(Json::Value defInstance) {
    InstanceModel* instance = new InstanceModel(
        idModels[defInstance["reference"].asString()]);
    mat4 modelView(1);
    modelView *= Translate(getVec3(defInstance.get("translate","[0,0,0]")));
    instance->setModelView(modelView);
    models.push_back(instance);
    return instance;
}
コード例 #4
0
ファイル: scene.cpp プロジェクト: TTU-Graphics/FinalProject
void Scene::buildAnimation(Json::Value anim) {
    //printf("creating anim: %s\n",anim.toStyledString().c_str());
    string type = anim["type"].asString();

    //orbit
    if(type.compare("orbit") == 0) {
        Animation* animation = new OrbitalModel(
            (idModels.find(anim["center"].asString())->second),
            (idModels.find(anim["orbiter"].asString())->second),
            anim.get("distance","1").asFloat(),
            anim.get("theta","0").asFloat(),
            anim.get("phi","0").asFloat());
        animations.push_back(animation);
    }
    //oscillate
    else if(type.compare("oscillate") == 0) {
        vec3 max = getVec3(anim.get("max","[0,0,0]"));
        vec3 rate = getVec3(anim.get("rate","[0,0,0]"));
        vec3 center = getVec3(anim.get("center","[0,0,0]"));

        Animation* animation = new OscillatingModel(
            (idModels.find(anim["object"].asString())->second),
            max.x, max.y, max.z,
            rate.x, rate.y, rate.z,
            center.x, center.y, center.z );
        animations.push_back(animation);
    }
    else if(type.compare("controlled") == 0) {
        vec3 limit = getVec3(anim.get("limit","[0,0,0]"));

        Animation* animation = new ControlledModel(
            (idModels.find(anim["object"].asString())->second),
            anim.get("speed",0.1).asFloat(),
            limit.x, limit.y, limit.z );
        animations.push_back(animation);
    }
    else if(type.compare("physics") == 0) {
        Animation* animation = new ParticlesModel( (Particles*)(idModels.find(anim["object"].asString())->second) );
        animations.push_back(animation);
    }
}
コード例 #5
0
ファイル: camera_rig.cpp プロジェクト: Bonch90/GearVRf
void CameraRig::predict(float time) {
    long long clock_time = getCurrentTime();
    float time_diff = (clock_time - rotation_sensor_data_.time_stamp())
            / 1000000000.0f;

    glm::vec3 axis = rotation_sensor_data_.gyro();
    float angle = glm::length(axis);

    if (angle != 0.0f) {
        axis /= angle;
    }
    angle *= (time + time_diff) * 180.0f / M_PI;

    glm::quat rotation = rotation_sensor_data_.quaternion()
            * glm::angleAxis(angle, axis);

    glm::quat transfrom_rotation = complementary_rotation_ * rotation;

    if (camera_rig_type_ == FREE) {
        owner_object()->transform()->set_rotation(transfrom_rotation);
    } else if (camera_rig_type_ == YAW_ONLY) {
        glm::vec3 look_at = glm::rotate(transfrom_rotation,
                glm::vec3(0.0f, 0.0f, -1.0f));
        float yaw = atan2f(-look_at.x, -look_at.z) * 180.0f / M_PI;
        owner_object()->transform()->set_rotation(
                glm::angleAxis(yaw, glm::vec3(0.0f, 1.0f, 0.0f)));
    } else if (camera_rig_type_ == ROLL_FREEZE) {
        glm::vec3 look_at = glm::rotate(transfrom_rotation,
                glm::vec3(0.0f, 0.0f, -1.0f));
        float pitch = atan2f(look_at.y,
                sqrtf(look_at.x * look_at.x + look_at.z * look_at.z)) * 180.0f
                / M_PI;
        float yaw = atan2f(-look_at.x, -look_at.z) * 180.0f / M_PI;
        owner_object()->transform()->set_rotation(
                glm::angleAxis(pitch, glm::vec3(1.0f, 0.0f, 0.0f)));
        owner_object()->transform()->rotateByAxis(yaw, 0.0f, 1.0f, 0.0f);
    } else if (camera_rig_type_ == FREEZE) {
        owner_object()->transform()->set_rotation(glm::quat());
    } else if (camera_rig_type_ == ORBIT_PIVOT) {
        glm::vec3 pivot(getVec3("pivot"));
        owner_object()->transform()->set_position(pivot.x, pivot.y,
                pivot.z + getFloat("distance"));
        owner_object()->transform()->set_rotation(glm::quat());
        owner_object()->transform()->rotateWithPivot(transfrom_rotation.w,
                transfrom_rotation.x, transfrom_rotation.y,
                transfrom_rotation.z, pivot.x, pivot.y, pivot.z);
    }
}
コード例 #6
0
// ----------------------------------------------------------------------------
KartUpdateMessage::KartUpdateMessage(ENetPacket* pkt)
                  : Message(pkt, MT_KART_INFO)
{
    World *world = World::getWorld();
    unsigned int num_karts = getInt();
    for(unsigned int i=0; i<num_karts; i++)
    {
        // Currently not used
        KartControl kc(this);
        Vec3 xyz = getVec3();
        btQuaternion q = getQuaternion();
        Kart *kart = world->getKart(i);
        kart->setXYZ(xyz);
        kart->setRotation(q);
    }   // for i
};   // KartUpdateMessage
コード例 #7
0
ファイル: PerlinFace.cpp プロジェクト: heracek/hifi
void PerlinFace::updatePositions() {
    const float BROWS_UP_MAX = 3;
    const float BROWS_DOWN_MAX = 1;
    const float BROWS_UP_CENTER_MAX = 1;

    Faceshift* faceshift = Application::getInstance()->getFaceshift();
    if (faceshift->isActive()) {
        _browsD_L = faceshift->getBrowDownLeft();
        _browsD_R = faceshift->getBrowDownRight();
        _browsU_C = faceshift->getBrowUpCenter();
        _browsU_L = faceshift->getBrowUpLeft();
        _browsU_R = faceshift->getBrowUpRight();
        _mouthSize = faceshift->getMouthSize();
        _mouthSmileLeft = faceshift->getMouthSmileLeft();
        _mouthSmileRight = faceshift->getMouthSmileRight();
        _eyeBlink_L = faceshift->getLeftBlink();
        _eyeBlink_R = faceshift->getRightBlink();
        _eyeOpen_L = faceshift->getLeftEyeOpen();
        _eyeOpen_R = faceshift->getRightEyeOpen();
    }


    // Update left brow
    _vertices[BROW_LEFT].y = getVec3(BROW_LEFT).y
                             + _browsU_L * BROWS_UP_MAX
                             - _browsD_L * BROWS_DOWN_MAX
                             - _browsU_C * BROWS_UP_CENTER_MAX;
    _vertices[BROW_MID_TOP].y = getVec3(BROW_MID_TOP).y
                                + _browsU_L * BROWS_UP_MAX
                                - _browsD_L * BROWS_DOWN_MAX;
    _vertices[BROW_MID_BOTTOM].y = getVec3(BROW_MID_BOTTOM).y
                                   + _browsU_L * BROWS_UP_MAX
                                   - _browsD_L * BROWS_DOWN_MAX;
    _vertices[BROW_RIGHT_TOP].y = getVec3(BROW_RIGHT_TOP).y
                                  + _browsU_L * BROWS_UP_MAX
                                  - _browsD_L * BROWS_DOWN_MAX
                                  + _browsU_C * BROWS_UP_CENTER_MAX;
    _vertices[BROW_RIGHT_BOTTOM].y = getVec3(BROW_RIGHT_BOTTOM).y
                                     + _browsU_L * BROWS_UP_MAX
                                     - _browsD_L * BROWS_DOWN_MAX
                                     + _browsU_C * BROWS_UP_CENTER_MAX;

    // Update right brow
    _vertices[NUM_VERTICES + BROW_LEFT].y = getVec3(NUM_VERTICES + BROW_LEFT).y
                                            + _browsU_R * BROWS_UP_MAX
                                            - _browsD_R * BROWS_DOWN_MAX
                                            - _browsU_C * BROWS_UP_CENTER_MAX;
    _vertices[NUM_VERTICES + BROW_MID_TOP].y = getVec3(NUM_VERTICES + BROW_MID_TOP).y
            + _browsU_R * BROWS_UP_MAX
            - _browsD_R * BROWS_DOWN_MAX;
    _vertices[NUM_VERTICES + BROW_MID_BOTTOM].y = getVec3(NUM_VERTICES + BROW_MID_BOTTOM).y
            + _browsU_R * BROWS_UP_MAX
            - _browsD_R * BROWS_DOWN_MAX;
    _vertices[NUM_VERTICES + BROW_RIGHT_TOP].y = getVec3(NUM_VERTICES + BROW_RIGHT_TOP).y
            + _browsU_R * BROWS_UP_MAX
            - _browsD_R * BROWS_DOWN_MAX
            + _browsU_C * BROWS_UP_CENTER_MAX;
    _vertices[NUM_VERTICES + BROW_RIGHT_BOTTOM].y = getVec3(NUM_VERTICES + BROW_RIGHT_BOTTOM).y
            + _browsU_R * BROWS_UP_MAX
            - _browsD_R * BROWS_DOWN_MAX
            + _browsU_C * BROWS_UP_CENTER_MAX;

    const float MOUTH_UP_MAX = 6.5f;
    const float MOUTH_SIDE_UP_MAX = 4.0f;
    const float SMILE_FACTOR = 1.0f / 3.0f;  // 0 = No smile, 1 = The Jocker.

    // Mouth
    _vertices[MOUTH_BOTTOM_IN].y = getVec3(MOUTH_BOTTOM_IN).y
                                   + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[MOUTH_BOTTOM_OUT].y = getVec3(MOUTH_BOTTOM_OUT).y
                                    + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[MOUTH_MID_IN] = (1.0f - (_mouthSmileLeft * SMILE_FACTOR)) * (getVec3(MOUTH_MID_IN)
                              + glm::vec3(0, (1.0 - _mouthSize) * MOUTH_SIDE_UP_MAX, 0))
                              + (_mouthSmileLeft * SMILE_FACTOR) * getVec3(CHICK_MID);
    _vertices[MOUTH_MID_OUT] = (1.0f - (_mouthSmileLeft * SMILE_FACTOR)) * (getVec3(MOUTH_MID_OUT)
                               + glm::vec3(0, (1.0 - _mouthSize) * MOUTH_SIDE_UP_MAX, 0))
                               + (_mouthSmileLeft * SMILE_FACTOR) * getVec3(CHICK_MID);


    _vertices[NUM_VERTICES + MOUTH_BOTTOM_IN].y = getVec3(NUM_VERTICES + MOUTH_BOTTOM_IN).y
            + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[NUM_VERTICES + MOUTH_BOTTOM_OUT].y = getVec3(NUM_VERTICES + MOUTH_BOTTOM_OUT).y
            + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[NUM_VERTICES + MOUTH_MID_IN] = (1.0f - (_mouthSmileLeft * SMILE_FACTOR)) * (getVec3(NUM_VERTICES + MOUTH_MID_IN)
            + glm::vec3(0, (1.0 - _mouthSize) * MOUTH_SIDE_UP_MAX, 0))
            + (_mouthSmileLeft * SMILE_FACTOR) * getVec3(NUM_VERTICES + CHICK_MID);
    _vertices[NUM_VERTICES + MOUTH_MID_OUT] = (1.0f - (_mouthSmileLeft * SMILE_FACTOR)) * (getVec3(NUM_VERTICES + MOUTH_MID_OUT)
            + glm::vec3(0, (1.0 - _mouthSize) * MOUTH_SIDE_UP_MAX, 0))
            + (_mouthSmileLeft * SMILE_FACTOR) * getVec3(NUM_VERTICES + CHICK_MID);



    // Jaw
    _vertices[CHIN_IN].y = getVec3(CHIN_IN).y
                           + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[CHIN_TIP].y = getVec3(CHIN_TIP).y
                            + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[CHIN_BOTTOM].y = getVec3(CHIN_BOTTOM).y
                               + (1.0 - _mouthSize) * MOUTH_UP_MAX;

    _vertices[NUM_VERTICES +CHIN_IN].y = getVec3(NUM_VERTICES + CHIN_IN).y
                                         + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[NUM_VERTICES +CHIN_TIP].y = getVec3(NUM_VERTICES + CHIN_TIP).y
                                          + (1.0 - _mouthSize) * MOUTH_UP_MAX;
    _vertices[NUM_VERTICES +CHIN_BOTTOM].y = getVec3(NUM_VERTICES + CHIN_BOTTOM).y
            + (1.0 - _mouthSize) * MOUTH_UP_MAX;


    // Eyelids
    glm::vec3 topLeftEyelid = getVec3(EYE_MID_TOP);
    glm::vec3 bottomLeftEyelid = getVec3(EYE_MID_BOTTOM);
    glm::vec3 topRightEyelid = getVec3(NUM_VERTICES + EYE_MID_TOP);
    glm::vec3 bottomRightEyelid = getVec3(NUM_VERTICES + EYE_MID_BOTTOM);

    _vertices[EYE_MID_TOP] = (1.0f - (_eyeBlink_L - _eyeOpen_L / 2.0f)) * topLeftEyelid
                             + (_eyeBlink_L - _eyeOpen_L / 2.0f) * (topLeftEyelid + bottomLeftEyelid) / 2.0f;
    _vertices[EYE_MID_BOTTOM] = (1.0f - (_eyeBlink_L - _eyeOpen_L / 2.0f)) * bottomLeftEyelid
                                + (_eyeBlink_L - _eyeOpen_L / 2.0f) * (topLeftEyelid + bottomLeftEyelid) / 2.0f;

    _vertices[NUM_VERTICES + EYE_MID_TOP] = (1.0f - (_eyeBlink_R - _eyeOpen_R / 2.0f)) * topRightEyelid
                                            + (_eyeBlink_R - _eyeOpen_R / 2.0f) * (topRightEyelid + bottomRightEyelid) / 2.0f;
    _vertices[NUM_VERTICES + EYE_MID_BOTTOM] = (1.0f - (_eyeBlink_R - _eyeOpen_R / 2.0f)) * bottomRightEyelid
            + (_eyeBlink_R - _eyeOpen_R / 2.0f) * (topRightEyelid + bottomRightEyelid) / 2.0f;
}
コード例 #8
0
ファイル: scene.cpp プロジェクト: TTU-Graphics/FinalProject
Model* Scene::buildModel(Json::Value model) {
    string type = model["class"].asString();
    Model *retModel;
    // menger
    if(type.compare("Menger") == 0) {
        vec3 center = getVec3(model.get("center", "[0,0,0]"));
        printVec("center",center);
        float radius = model.get("radius", "1.0").asFloat();
        int subdivs = model.get("subdivisions", "2").asInt();
        retModel = new Menger(center, radius, subdivs);
    }
    // sphere
    else if(type.compare("Sphere") == 0) {
        Sphere *sphere;
        if(!model.isMember("ambient")) {
            sphere = new Sphere(
                model["radius"].asFloat(),
                model["subdivs"].asInt(),
                lights.size());
        } else {
            sphere = new Sphere(
                model["radius"].asFloat(),
                model["subdivs"].asInt(),
                lights.size(),
                getVec4(model.get("ambient","[1,0,1,1]")),
                getVec4(model.get("diffuse","[1,0.8,0,1]")),
                getVec4(model.get("specular","[1,0,1,1]")));
        }
        vector<Light*>::iterator it;
        int light = 0;
        for(it = lights.begin(); it != lights.end(); it++) {
            sphere->setLight((*it), light++);
        }
        retModel = sphere;
    } else if(type.compare("TexTri") == 0) {
        retModel = new TexTri(model["texture"].asString().c_str());
        printf("created textri\n");
    } else if(type.compare("ObjModel") == 0) {
        ObjModel *obj = new ObjModel(model["objfile"].asString().c_str(),
                                     lights.size(),
                                     getVec4(model.get("ambient","[1,1,1,1]")),
                                     getVec4(model.get("diffuse","[1,1,1,1]")),
                                     getVec4(model.get("specular","[1,1,1,1]")));
        vector<Light*>::iterator it;
        int light = 0;
        for(it = lights.begin(); it != lights.end(); it++) {
            obj->setLight((*it), light++);
        }
        retModel = obj;
    } else if(type.compare("Tesseract") == 0) {
        Tesseract *tess = new Tesseract( lights.size() );
        vector<Light*>::iterator it;
        int light = 0;
        for(it = lights.begin(); it != lights.end(); it++) {
            tess->setLight((*it), light++);
        }
        retModel = tess;
    } else if(type.compare("Particles") == 0) {
        Particles *part = new Particles( model.get("number",50).asInt() );
        retModel = part;
    }

    // map model if it has an id
    if(model.isMember("id")) {
        string id = model["id"].asString();
        nodes[id] = retModel;
        idModels[id] = retModel;
    }
    return retModel;
}