00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef FF3DDiscForceModel_H
00024 #define FF3DDiscForceModel_H
00025 #include "micolelib.h"
00026
00027 #include "FF3DForceModel.h"
00028 #include <LinearAlgebra.h>
00029 using namespace Reachin;
00030
00034 struct MICOLELIB_API FF3DDiscForceModel : FF3DForceModel
00035 {
00036 mgFloat _stiffness;
00037
00038 Vec3f _pt1;
00039 Vec3f _pt2;
00040 Vec3f _pt3;
00041
00042 mgFloat _range;
00043
00049 FF3DDiscForceModel(const Vec3f &pt1, const Vec3f &pt2, const mgFloat &pRange, const mgFloat &stiffness = 800);
00050 FF3DDiscForceModel (const FF3DDiscForceModel& fm);
00051
00052 virtual FF3DForceModel * clone() {return new FF3DDiscForceModel(*this); }
00053
00054 virtual Vec3f evaluate( const Vec3f &pPos, const mgFloat &w )
00055 {
00056
00057 Vec3f pos = pPos;
00058 pos.x = 0;
00059 pos.z = 0;
00060 Vec3f diff = Vec3f(0,0,0) - pos;
00061 diff.x = 0;
00062 diff.z = 0;
00063
00064
00065
00066 Vec3f diff2 = Vec3f(0,0,0) - pPos;
00067
00068
00069 if (diff2.length()< _range)
00070 diff2 = Vec3f(0,0,0);
00071 else
00072 {
00073 Vec3f normaldiff = diff2;
00074 normaldiff.normalizeSafe();
00075
00076 diff2 = (diff2-(_range * normaldiff));
00077 }
00078
00079
00080 diff2.y = diff.y;
00081
00082 return (_stiffness * diff2);
00083 }
00084 };
00085
00086 #endif