bool key_pressed()

in code/cpp/tools/scene_annotation_tool/main.cpp [2694:2786]


bool key_pressed(igl::opengl::glfw::Viewer& viewer, unsigned char key, int modifier) {

    switch(key) {
        case 'W':
        case 'w':
        {
            Eigen::Vector3f camera_look_at_dir = (viewer.core().camera_center - viewer.core().camera_eye) / (viewer.core().camera_center - viewer.core().camera_eye).norm();
            float camera_look_at_dist          = (viewer.core().camera_center - viewer.core().camera_eye).norm();

            // TODO: convert to metric
            auto delta  = 5.0f*g_navigation_sensitivity;
            auto eps  = 10.0f;
            auto delta_ = std::min(std::max(eps-camera_look_at_dist+delta, 0.0f), delta); // always keep center at least eps away from eye, most of the time this term is 0

            viewer.core().camera_eye = viewer.core().camera_eye + delta*camera_look_at_dir;
            viewer.core().camera_center = viewer.core().camera_center + delta_*camera_look_at_dir;
            break;
        }

        case 'S':
        case 's':
        {
            Eigen::Vector3f camera_look_at_dir = (viewer.core().camera_center - viewer.core().camera_eye) / (viewer.core().camera_center - viewer.core().camera_eye).norm();
            float camera_look_at_dist          = (viewer.core().camera_center - viewer.core().camera_eye).norm();

            // TODO: convert to metric
            auto delta = -5.0*g_navigation_sensitivity;

            viewer.core().camera_eye = viewer.core().camera_eye + delta*camera_look_at_dir;
            break;
        }

        case 'A':
        case 'a':
        {
            Eigen::Vector3f camera_look_at_dir = (viewer.core().camera_center - viewer.core().camera_eye) / (viewer.core().camera_center - viewer.core().camera_eye).norm();
            Eigen::Vector3f camera_right_dir   = camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()) / camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()).norm();

            // TODO: convert to metric
            auto delta = -5.0*g_navigation_sensitivity;

            viewer.core().camera_eye    = viewer.core().camera_eye    + delta*camera_right_dir;
            viewer.core().camera_center = viewer.core().camera_center + delta*camera_right_dir;
            break;
        }

        case 'D':
        case 'd':
        {
            Eigen::Vector3f camera_look_at_dir = (viewer.core().camera_center - viewer.core().camera_eye) / (viewer.core().camera_center - viewer.core().camera_eye).norm();
            Eigen::Vector3f camera_right_dir   = camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()) / camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()).norm();

            // TODO: convert to metric
            auto delta = 5.0*g_navigation_sensitivity;

            viewer.core().camera_eye    = viewer.core().camera_eye    + delta*camera_right_dir;
            viewer.core().camera_center = viewer.core().camera_center + delta*camera_right_dir;
            break;
        }

        case 'R':
        case 'r':
        {
            Eigen::Vector3f camera_look_at_dir = (viewer.core().camera_center - viewer.core().camera_eye) / (viewer.core().camera_center - viewer.core().camera_eye).norm();
            Eigen::Vector3f camera_right_dir   = camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()) / camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()).norm();
            Eigen::Vector3f camera_up_dir      = -(camera_look_at_dir.cross(camera_right_dir) / camera_look_at_dir.cross(camera_right_dir).norm());

            // TODO: convert to metric
            auto delta = 5.0*g_navigation_sensitivity;

            viewer.core().camera_eye    = viewer.core().camera_eye    + delta*camera_up_dir;
            viewer.core().camera_center = viewer.core().camera_center + delta*camera_up_dir;
            break;
        }

        case 'F':
        case 'f':
        {
            Eigen::Vector3f camera_look_at_dir = (viewer.core().camera_center - viewer.core().camera_eye) / (viewer.core().camera_center - viewer.core().camera_eye).norm();
            Eigen::Vector3f camera_right_dir   = camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()) / camera_look_at_dir.cross(Eigen::Vector3f::UnitZ()).norm();
            Eigen::Vector3f camera_up_dir      = -(camera_look_at_dir.cross(camera_right_dir) / camera_look_at_dir.cross(camera_right_dir).norm());

            // TODO: convert to metric
            auto delta = -5.0*g_navigation_sensitivity;

            viewer.core().camera_eye    = viewer.core().camera_eye    + delta*camera_up_dir;
            viewer.core().camera_center = viewer.core().camera_center + delta*camera_up_dir;
            break;
        }
    }

    return true;
}