This repository has been archived on 2024-05-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ORB_SLAM3/Thirdparty/Pangolin/include/pangolin/scene/axis.h
PodmogilnyjIvan ff4acf84be raw
2021-12-03 03:34:31 -08:00

118 lines
3.3 KiB
C++

#pragma once
#include <pangolin/display/opengl_render_state.h>
#include <pangolin/display/viewport.h>
#include <pangolin/gl/gldraw.h>
#include <pangolin/scene/renderable.h>
#include <pangolin/scene/interactive_index.h>
#ifdef HAVE_EIGEN
# include <Eigen/Geometry>
#endif
namespace pangolin {
struct Axis : public Renderable, public Interactive
{
Axis()
: axis_length(1.0),
label_x(InteractiveIndex::I().Store(this)),
label_y(InteractiveIndex::I().Store(this)),
label_z(InteractiveIndex::I().Store(this))
{
}
void Render(const RenderParams&) override {
glColor4f(1,0,0,1);
glPushName(label_x.Id());
glDrawLine(0,0,0, axis_length,0,0);
glPopName();
glColor4f(0,1,0,1);
glPushName(label_y.Id());
glDrawLine(0,0,0, 0,axis_length,0);
glPopName();
glColor4f(0,0,1,1);
glPushName(label_z.Id());
glDrawLine(0,0,0, 0,0,axis_length);
glPopName();
}
bool Mouse(
int button,
const GLprecision /*win*/[3], const GLprecision /*obj*/[3], const GLprecision /*normal*/[3],
bool /*pressed*/, int button_state, int pickId
) override
{
PANGOLIN_UNUSED(button);
PANGOLIN_UNUSED(button_state);
PANGOLIN_UNUSED(pickId);
#ifdef HAVE_EIGEN
if((button == MouseWheelUp || button == MouseWheelDown) ) {
float scale = (button == MouseWheelUp) ? 0.01f : -0.01f;
if(button_state & KeyModifierShift) scale /= 10;
Eigen::Vector3d rot = Eigen::Vector3d::Zero();
Eigen::Vector3d xyz = Eigen::Vector3d::Zero();
if(button_state & KeyModifierCtrl) {
// rotate
if(pickId == label_x.Id()) {
rot << 1,0,0;
}else if(pickId == label_y.Id()) {
rot << 0,1,0;
}else if(pickId == label_z.Id()) {
rot << 0,0,1;
}else{
return false;
}
}else if(button_state & KeyModifierShift){
// translate
if(pickId == label_x.Id()) {
xyz << 1,0,0;
}else if(pickId == label_y.Id()) {
xyz << 0,1,0;
}else if(pickId == label_z.Id()) {
xyz << 0,0,1;
}else{
return false;
}
}else{
return false;
}
// old from new
Eigen::Matrix<double,4,4> T_on = Eigen::Matrix<double,4,4>::Identity();
T_on.block<3,3>(0,0) = Eigen::AngleAxis<double>(scale,rot).toRotationMatrix();
T_on.block<3,1>(0,3) = scale*xyz;
// Update
T_pc = (ToEigen<double>(T_pc) * T_on.inverse()).eval();
return true;
}
#endif // HAVE_EIGEN
return false;
}
virtual bool MouseMotion(
const GLprecision /*win*/[3], const GLprecision /*obj*/[3], const GLprecision /*normal*/[3],
int /*button_state*/, int /*pickId*/
) override
{
return false;
}
float axis_length;
const InteractiveIndex::Token label_x;
const InteractiveIndex::Token label_y;
const InteractiveIndex::Token label_z;
};
}