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;
}