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 #include "constraint.h"
00024 #include "frame.h"
00025 #include "camera.h"
00026
00027 using namespace qglviewer;
00028 using namespace std;
00029
00031
00033
00038 AxisPlaneConstraint::AxisPlaneConstraint()
00039 : translationConstraintType_(FREE), rotationConstraintType_(FREE)
00040 {
00041
00042 }
00043
00045 void AxisPlaneConstraint::setTranslationConstraint(Type type, const Vec& direction)
00046 {
00047 setTranslationConstraintType(type);
00048 setTranslationConstraintDirection(direction);
00049 }
00050
00052 void AxisPlaneConstraint::setTranslationConstraintDirection(const Vec& direction)
00053 {
00054 if ((translationConstraintType()!=AxisPlaneConstraint::FREE) && (translationConstraintType()!=AxisPlaneConstraint::FORBIDDEN))
00055 {
00056 const float norm = direction.norm();
00057 if (norm < 1E-8)
00058 {
00059 qWarning("AxisPlaneConstraint::setTranslationConstraintDir: null vector for translation constraint");
00060 translationConstraintType_ = AxisPlaneConstraint::FREE;
00061 }
00062 else
00063 translationConstraintDir_ = direction/norm;
00064 }
00065 }
00066
00068 void AxisPlaneConstraint::setRotationConstraint(Type type, const Vec& direction)
00069 {
00070 setRotationConstraintType(type);
00071 setRotationConstraintDirection(direction);
00072 }
00073
00075 void AxisPlaneConstraint::setRotationConstraintDirection(const Vec& direction)
00076 {
00077 if ((rotationConstraintType()!=AxisPlaneConstraint::FREE) && (rotationConstraintType()!=AxisPlaneConstraint::FORBIDDEN))
00078 {
00079 float norm = direction.norm();
00080 if (norm < 1E-8)
00081 {
00082 qWarning("AxisPlaneConstraint::setRotationConstraintDir: null vector for rotation constraint");
00083 rotationConstraintType_ = AxisPlaneConstraint::FREE;
00084 }
00085 else
00086 rotationConstraintDir_ = direction/norm;
00087 }
00088 }
00089
00101 void AxisPlaneConstraint::setRotationConstraintType(Type type)
00102 {
00103 if (rotationConstraintType() == AxisPlaneConstraint::PLANE)
00104 {
00105 qWarning("AxisPlaneConstraint::setRotationConstraintType: the PLANE type cannot be used for a rotation constraints");
00106 return;
00107 }
00108
00109 rotationConstraintType_ = type;
00110 }
00111
00112
00114
00116
00120 void LocalConstraint::constrainTranslation(Vec& translation, Frame* const frame)
00121 {
00122 Vec proj;
00123 switch (translationConstraintType())
00124 {
00125 case AxisPlaneConstraint::FREE:
00126 break;
00127 case AxisPlaneConstraint::PLANE:
00128 proj = frame->rotation().rotate(translationConstraintDirection());
00129 translation.projectOnPlane(proj);
00130 break;
00131 case AxisPlaneConstraint::AXIS:
00132 proj = frame->rotation().rotate(translationConstraintDirection());
00133 translation.projectOnAxis(proj);
00134 break;
00135 case AxisPlaneConstraint::FORBIDDEN:
00136 translation = Vec(0.0, 0.0, 0.0);
00137 break;
00138 }
00139 }
00140
00144 void LocalConstraint::constrainRotation(Quaternion& rotation, Frame* const)
00145 {
00146 switch (rotationConstraintType())
00147 {
00148 case AxisPlaneConstraint::FREE:
00149 break;
00150 case AxisPlaneConstraint::PLANE:
00151 break;
00152 case AxisPlaneConstraint::AXIS:
00153 {
00154 Vec axis = rotationConstraintDirection();
00155 Vec quat = Vec(rotation[0], rotation[1], rotation[2]);
00156 quat.projectOnAxis(axis);
00157 rotation = Quaternion(quat, 2.0*acos(rotation[3]));
00158 }
00159 break;
00160 case AxisPlaneConstraint::FORBIDDEN:
00161 rotation = Quaternion();
00162 break;
00163 }
00164 }
00165
00167
00169
00173 void WorldConstraint::constrainTranslation(Vec& translation, Frame* const frame)
00174 {
00175 Vec proj;
00176 switch (translationConstraintType())
00177 {
00178 case AxisPlaneConstraint::FREE:
00179 break;
00180 case AxisPlaneConstraint::PLANE:
00181 if (frame->referenceFrame())
00182 {
00183 proj = frame->referenceFrame()->transformOf(translationConstraintDirection());
00184 translation.projectOnPlane(proj);
00185 }
00186 else
00187 translation.projectOnPlane(translationConstraintDirection());
00188 break;
00189 case AxisPlaneConstraint::AXIS:
00190 if (frame->referenceFrame())
00191 {
00192 proj = frame->referenceFrame()->transformOf(translationConstraintDirection());
00193 translation.projectOnAxis(proj);
00194 }
00195 else
00196 translation.projectOnAxis(translationConstraintDirection());
00197 break;
00198 case AxisPlaneConstraint::FORBIDDEN:
00199 translation = Vec(0.0, 0.0, 0.0);
00200 break;
00201 }
00202 }
00203
00207 void WorldConstraint::constrainRotation(Quaternion& rotation, Frame* const frame)
00208 {
00209 switch (rotationConstraintType())
00210 {
00211 case AxisPlaneConstraint::FREE:
00212 break;
00213 case AxisPlaneConstraint::PLANE:
00214 break;
00215 case AxisPlaneConstraint::AXIS:
00216 {
00217 Vec quat(rotation[0], rotation[1], rotation[2]);
00218 Vec axis = frame->transformOf(rotationConstraintDirection());
00219 quat.projectOnAxis(axis);
00220 rotation = Quaternion(quat, 2.0*acos(rotation[3]));
00221 break;
00222 }
00223 case AxisPlaneConstraint::FORBIDDEN:
00224 rotation = Quaternion();
00225 break;
00226 }
00227 }
00228
00230
00232
00235 CameraConstraint::CameraConstraint(const Camera* const camera)
00236 : AxisPlaneConstraint(), camera_(camera)
00237 {}
00238
00242 void CameraConstraint::constrainTranslation(Vec& translation, Frame* const frame)
00243 {
00244 Vec proj;
00245 switch (translationConstraintType())
00246 {
00247 case AxisPlaneConstraint::FREE:
00248 break;
00249 case AxisPlaneConstraint::PLANE:
00250 proj = camera()->frame()->inverseTransformOf(translationConstraintDirection());
00251 if (frame->referenceFrame())
00252 proj = frame->referenceFrame()->transformOf(proj);
00253 translation.projectOnPlane(proj);
00254 break;
00255 case AxisPlaneConstraint::AXIS:
00256 proj = camera()->frame()->inverseTransformOf(translationConstraintDirection());
00257 if (frame->referenceFrame())
00258 proj = frame->referenceFrame()->transformOf(proj);
00259 translation.projectOnAxis(proj);
00260 break;
00261 case AxisPlaneConstraint::FORBIDDEN:
00262 translation = Vec(0.0, 0.0, 0.0);
00263 break;
00264 }
00265 }
00266
00270 void CameraConstraint::constrainRotation(Quaternion& rotation, Frame* const frame)
00271 {
00272 switch (rotationConstraintType())
00273 {
00274 case AxisPlaneConstraint::FREE:
00275 break;
00276 case AxisPlaneConstraint::PLANE:
00277 break;
00278 case AxisPlaneConstraint::AXIS:
00279 {
00280 Vec axis = frame->transformOf(camera()->frame()->inverseTransformOf(rotationConstraintDirection()));
00281 Vec quat = Vec(rotation[0], rotation[1], rotation[2]);
00282 quat.projectOnAxis(axis);
00283 rotation = Quaternion(quat, 2.0*acos(rotation[3]));
00284 }
00285 break;
00286 case AxisPlaneConstraint::FORBIDDEN:
00287 rotation = Quaternion();
00288 break;
00289 }
00290 }