00001 /****************************************************************************** 00002 * SOFA, Simulation Open-Framework Architecture, version 1.0 beta 3 * 00003 * (c) 2006-2008 MGH, INRIA, USTL, UJF, CNRS * 00004 * * 00005 * This library is free software; you can redistribute it and/or modify it * 00006 * under the terms of the GNU Lesser General Public License as published by * 00007 * the Free Software Foundation; either version 2.1 of the License, or (at * 00008 * your option) any later version. * 00009 * * 00010 * This library is distributed in the hope that it will be useful, but WITHOUT * 00011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * 00012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * 00013 * for more details. * 00014 * * 00015 * You should have received a copy of the GNU Lesser General Public License * 00016 * along with this library; if not, write to the Free Software Foundation, * 00017 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 00018 ******************************************************************************* 00019 * SOFA :: Modules * 00020 * * 00021 * Authors: The SOFA Team and external contributors (see Authors.txt) * 00022 * * 00023 * Contact information: contact@sofa-framework.org * 00024 ******************************************************************************/ 00025 #include <sofa/component/controller/EnslavementForceFeedback.h> 00026 #include <sofa/core/ObjectFactory.h> 00027 00028 using namespace std; 00029 00030 namespace sofa 00031 { 00032 namespace component 00033 { 00034 namespace controller 00035 { 00036 00037 void EnslavementForceFeedback::init() 00038 { 00039 this->ForceFeedback::init(); 00040 OmniDriver* driver = context->get<OmniDriver>(); 00041 cout << "init EnslavementForceFeedback" << driver << " done " << std::endl; 00042 00043 driver->setForceFeedback(this); 00044 00045 mState = dynamic_cast<MechanicalState<Rigid3dTypes> *> (this->getContext()->getMechanicalState()); 00046 if (!mState) 00047 std::cerr << "WARNING - EnslavementForceFeedback has no binding MechanicalState\n"; 00048 simulation::tree::GNode* context = dynamic_cast<simulation::tree::GNode*>(getContext()); 00049 context->getTreeObjects<core::CollisionModel>(&collisionModels); 00050 } 00051 00052 void EnslavementForceFeedback::computeForce(double x, double y, double z, double u, double v, double w, double q, double& fx, double& fy, double& fz) 00053 { 00054 if (f_activate.getValue()) 00055 { 00056 for (unsigned int i=0; i<collisionModels.size(); i++) 00057 { 00058 if (collisionModels[i]->getNumberOfContacts() > 0) 00059 { 00060 double mx = (*mState->getX())[0].getCenter()[0]; 00061 double my = (*mState->getX())[0].getCenter()[1]; 00062 double mz = (*mState->getX())[0].getCenter()[2]; 00063 00064 fx = 3.0 * (mx - x); 00065 fy = 3.0 * (my - y); 00066 fz = 3.0 * (mz - z); 00067 return; 00068 } 00069 } 00070 } 00071 fx = 0.0; 00072 fy = 0.0; 00073 fz = 0.0; 00074 } 00075 00076 int enslavementForceFeedbackClass = sofa::core::RegisterObject("Eslavement force feedback for the omni") 00077 .add< EnslavementForceFeedback >(); 00078 00079 SOFA_DECL_CLASS(EnslavementForceFeedback) 00080 00081 } // namespace controller 00082 } // namespace component 00083 } // namespace sofa
1.5.7.1