Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00039
00040 #include <algorithm>
00041 #include <math.h>
00042 #include <pcl/apps/point_cloud_editor/common.h>
00043 #include <pcl/apps/point_cloud_editor/cloudTransformTool.h>
00044 #include <pcl/apps/point_cloud_editor/cloud.h>
00045
00046 const float DEG_2_RADS = M_PI / 180.0f;
00047
00048 const float CloudTransformTool::DEFAULT_SCALE_FACTOR_ = 1.14;
00049 const float CloudTransformTool::DEFAULT_TRANSLATE_FACTOR_ = 0.001f;
00050
00051
00052 CloudTransformTool::CloudTransformTool (CloudPtr cloud_ptr)
00053 : cloud_ptr_(cloud_ptr), x_(0), y_(0), scale_factor_(DEFAULT_SCALE_FACTOR_),
00054 translate_factor_(DEFAULT_TRANSLATE_FACTOR_)
00055 {
00056 setIdentity(transform_matrix_);
00057 }
00058
00059 CloudTransformTool::~CloudTransformTool ()
00060 {
00061 }
00062
00063 void
00064 CloudTransformTool::start (int x, int y, BitMask, BitMask)
00065 {
00066 x_ = x;
00067 y_ = y;
00068
00069 trackball_.start(x, y);
00070 }
00071
00072 void
00073 CloudTransformTool::update (int x, int y, BitMask modifiers, BitMask buttons)
00074 {
00075 if (!cloud_ptr_)
00076 return;
00077 if (!(buttons & LEFT))
00078 return;
00079
00080 float transform[MATRIX_SIZE];
00081
00082 int dx = (x - x_);
00083 int dy = (y - y_);
00084 if (dx == 0 && dy == 0)
00085 return;
00086 trackball_.update(x, y);
00087 if (modifiers & CTRL)
00088 getTranslateMatrix(dx, dy, transform);
00089 else if (modifiers & ALT)
00090 getZTranslateMatrix(dy, transform);
00091 else if (modifiers & SHFT)
00092 getScaleMatrix(dy, transform);
00093 else
00094 trackball_.getRotationMatrix(transform);
00095
00096 cloud_ptr_ -> multMatrix(transform);
00097
00098 x_ = x;
00099 y_ = y;
00100 }
00101
00102 void
00103 CloudTransformTool::getTranslateMatrix (int dx, int dy, float* matrix)
00104 {
00105 setIdentity(matrix);
00106 float scale = 1.0f / cloud_ptr_-> getScalingFactor();
00107 matrix[12] = float(dx) * translate_factor_ * scale;
00108 matrix[13] = float(-dy) * translate_factor_ * scale;
00109 }
00110
00111 void
00112 CloudTransformTool::getZTranslateMatrix (int dy, float* matrix)
00113 {
00114 setIdentity(matrix);
00115 matrix[14] = float(dy) * translate_factor_ / cloud_ptr_-> getScalingFactor();
00116 }
00117
00118 void
00119 CloudTransformTool::getScaleMatrix (int dy, float* matrix)
00120 {
00121 setIdentity(matrix);
00122 float scale = dy > 0 ? scale_factor_ : 1.0 / scale_factor_;
00123 for (unsigned int i = 0; i < MATRIX_SIZE-1; i+=MATRIX_SIZE_DIM+1)
00124 matrix[i] = scale;
00125 }
00126