RflySimSDK v3.05
RflySimSDK说明文档
载入中...
搜索中...
未找到
vrpn_ForceDevice.h
1#ifndef FORCEDEVICE_H
2#define FORCEDEVICE_H
3
4#include <stddef.h> // for NULL
5
6#include "vrpn_BaseClass.h" // for vrpn_Callback_List, etc
7#include "vrpn_Configure.h" // for VRPN_CALLBACK, VRPN_API
8#include "vrpn_Shared.h" // for timeval
9#include "vrpn_Types.h" // for vrpn_int32, vrpn_float32, etc
10
11class VRPN_API vrpn_Connection;
13
14#define MAXPLANE 4 // maximum number of planes in the scene
15
16// for recovery:
17#define DEFAULT_NUM_REC_CYCLES (10)
18
19// possible values for errorCode:
20#define FD_VALUE_OUT_OF_RANGE 0 // surface parameter out of range
21#define FD_DUTY_CYCLE_ERROR 1 // servo loop is taking too long
22#define FD_FORCE_ERROR 2 // max force exceeded, or motors overheated
23 // or amplifiers not enabled
24#define FD_MISC_ERROR 3 // everything else
25#define FD_OK 4 // no error
26
27// If defined, springs are implemented in the client as force fields.
28// If not, springs are implemented with special messages
29// and extra Ghost classes. Either way support for the messages
30// is compiled into the parent class so that servers can support
31// both kinds of clients.
32
33// (Springs as force fields require some knotty mathematical programming
34// at the clients that I can't seem to get right, but avoid lots of
35// extra message types and an awful lot of bug-prone Ghost.)
36
37#define FD_SPRINGS_AS_FIELDS
38
39class VRPN_API vrpn_ForceDevice : public vrpn_BaseClass {
40
41public:
42 vrpn_ForceDevice(const char *name, vrpn_Connection *c);
43 virtual ~vrpn_ForceDevice(void);
44
45 void print_report(void);
46 void print_plane(void);
47
48 void setSurfaceKspring(vrpn_float32 k) { SurfaceKspring = k; }
49 void setSurfaceKdamping(vrpn_float32 d) { SurfaceKdamping = d; }
50 void setSurfaceFstatic(vrpn_float32 ks) { SurfaceFstatic = ks; }
51 void setSurfaceFdynamic(vrpn_float32 kd) { SurfaceFdynamic = kd; }
52 void setRecoveryTime(int rt) { numRecCycles = rt; }
53
54 // additional surface properties
55 void setSurfaceKadhesionNormal(vrpn_float32 k)
56 {
57 SurfaceKadhesionNormal = k;
58 }
59 void setSurfaceKadhesionLateral(vrpn_float32 k)
60 {
61 SurfaceKadhesionLateral = k;
62 }
63 void setSurfaceBuzzFrequency(vrpn_float32 freq) { SurfaceBuzzFreq = freq; }
64 void setSurfaceBuzzAmplitude(vrpn_float32 amp) { SurfaceBuzzAmp = amp; }
65 void setSurfaceTextureWavelength(vrpn_float32 wl)
66 {
67 SurfaceTextureWavelength = wl;
68 }
69 void setSurfaceTextureAmplitude(vrpn_float32 amp)
70 {
71 SurfaceTextureAmplitude = amp;
72 }
73
74 void setCustomEffect(vrpn_int32 effectId, vrpn_float32 *params = NULL,
75 vrpn_uint32 nbParams = 0);
76
77 void setFF_Origin(vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
78 {
79 ff_origin[0] = x;
80 ff_origin[1] = y;
81 ff_origin[2] = z;
82 }
83 void setFF_Origin(vrpn_float32 x[3])
84 {
85 ff_origin[0] = x[0];
86 ff_origin[1] = x[1];
87 ff_origin[2] = x[2];
88 }
89 void setFF_Force(vrpn_float32 fx, vrpn_float32 fy, vrpn_float32 fz)
90 {
91 ff_force[0] = fx;
92 ff_force[1] = fy;
93 ff_force[2] = fz;
94 }
95 void setFF_Force(vrpn_float32 f[3])
96 {
97 ff_force[0] = f[0];
98 ff_force[1] = f[1];
99 ff_force[2] = f[2];
100 }
101 void setFF_Jacobian(vrpn_float32 dfxdx, vrpn_float32 dfxdy,
102 vrpn_float32 dfxdz, vrpn_float32 dfydx,
103 vrpn_float32 dfydy, vrpn_float32 dfydz,
104 vrpn_float32 dfzdx, vrpn_float32 dfzdy,
105 vrpn_float32 dfzdz)
106 {
107 ff_jacobian[0][0] = dfxdx;
108 ff_jacobian[0][1] = dfxdy;
109 ff_jacobian[0][2] = dfxdz;
110 ff_jacobian[1][0] = dfydx;
111 ff_jacobian[1][1] = dfydy;
112 ff_jacobian[1][2] = dfydz;
113 ff_jacobian[2][0] = dfzdx;
114 ff_jacobian[2][1] = dfzdy;
115 ff_jacobian[2][2] = dfzdz;
116 }
117 void setFF_Radius(vrpn_float32 r) { ff_radius = r; }
118
119 void set_plane(vrpn_float32 *p);
120 void set_plane(vrpn_float32 *p, vrpn_float32 d);
121 void set_plane(vrpn_float32 a, vrpn_float32 b, vrpn_float32 c,
122 vrpn_float32 d);
123
124 void sendError(int error_code);
125
126 int getRecoveryTime(void) { return numRecCycles; }
127 int connectionAvailable(void) { return (d_connection != NULL); }
128
129 // constants for constraint messages
130
131 enum ConstraintGeometry {
132 NO_CONSTRAINT,
133 POINT_CONSTRAINT,
134 LINE_CONSTRAINT,
135 PLANE_CONSTRAINT
136 };
137
138protected:
139 virtual int register_types(void);
140
141 vrpn_int32 force_message_id; // ID of force message to connection
142 vrpn_int32 plane_message_id; // ID of plane equation message
143 vrpn_int32 plane_effects_message_id; // additional plane properties
144 vrpn_int32 forcefield_message_id; // ID of force field message
145 vrpn_int32 scp_message_id; // ID of surface contact point message
146
147 // constraint messages
148
149 vrpn_int32 enableConstraint_message_id;
150 vrpn_int32 setConstraintMode_message_id;
151 vrpn_int32 setConstraintPoint_message_id;
152 vrpn_int32 setConstraintLinePoint_message_id;
153 vrpn_int32 setConstraintLineDirection_message_id;
154 vrpn_int32 setConstraintPlanePoint_message_id;
155 vrpn_int32 setConstraintPlaneNormal_message_id;
156 vrpn_int32 setConstraintKSpring_message_id;
157 // vrpn_int32 set_constraint_message_id;// ID of constraint force message
158
159 // XXX - error messages should be put into the vrpn base class
160 // whenever someone makes one
161
162 vrpn_int32 error_message_id; // ID of force device error message
163
164 // IDs for trimesh messages
165
166 vrpn_int32 addObject_message_id;
167 vrpn_int32 addObjectExScene_message_id;
168 vrpn_int32 moveToParent_message_id;
169 vrpn_int32 setObjectPosition_message_id;
170 vrpn_int32 setObjectOrientation_message_id;
171 vrpn_int32 setObjectScale_message_id;
172 vrpn_int32 removeObject_message_id;
173 vrpn_int32 setVertex_message_id;
174 vrpn_int32 setNormal_message_id;
175 vrpn_int32 setTriangle_message_id;
176 vrpn_int32 removeTriangle_message_id;
177 vrpn_int32 updateTrimeshChanges_message_id;
178 vrpn_int32 transformTrimesh_message_id;
179 vrpn_int32 setTrimeshType_message_id;
180 vrpn_int32 clearTrimesh_message_id;
181
182 // IDs for scene messages
183 vrpn_int32 setHapticOrigin_message_id;
184 vrpn_int32 setHapticScale_message_id;
185 vrpn_int32 setSceneOrigin_message_id;
186 vrpn_int32 getNewObjectID_message_id;
187 vrpn_int32 setObjectIsTouchable_message_id;
188
189 // ajout ONDIM
190 vrpn_int32 custom_effect_message_id;
191 // fni ajout ONDIM
192
193 // ENCODING
194 // ajout ONDIM
195 static char *encode_custom_effect(vrpn_int32 &len, vrpn_uint32 effectId,
196 const vrpn_float32 *params,
197 vrpn_uint32 nbParams);
198 // fin ajout ONDIM
199 static char *encode_force(vrpn_int32 &length, const vrpn_float64 *force);
200 static char *encode_scp(vrpn_int32 &length, const vrpn_float64 *pos,
201 const vrpn_float64 *quat);
202 static char *encode_plane(vrpn_int32 &length, const vrpn_float32 *plane,
203 const vrpn_float32 kspring,
204 const vrpn_float32 kdamp, const vrpn_float32 fdyn,
205 const vrpn_float32 fstat,
206 const vrpn_int32 plane_index,
207 const vrpn_int32 n_rec_cycles);
208 static char *encode_surface_effects(vrpn_int32 &len,
209 const vrpn_float32 k_adhesion_norm,
210 const vrpn_float32 k_adhesion_lat,
211 const vrpn_float32 tex_amp,
212 const vrpn_float32 tex_wl,
213 const vrpn_float32 buzz_amp,
214 const vrpn_float32 buzz_freq);
215 static char *encode_vertex(vrpn_int32 &len, const vrpn_int32 objNum,
216 const vrpn_int32 vertNum, const vrpn_float32 x,
217 const vrpn_float32 y, const vrpn_float32 z);
218 static char *encode_normal(vrpn_int32 &len, const vrpn_int32 objNum,
219 const vrpn_int32 vertNum, const vrpn_float32 x,
220 const vrpn_float32 y, const vrpn_float32 z);
221 static char *encode_triangle(vrpn_int32 &len, const vrpn_int32 objNum,
222 const vrpn_int32 triNum,
223 const vrpn_int32 vert0, const vrpn_int32 vert1,
224 const vrpn_int32 vert2, const vrpn_int32 norm0,
225 const vrpn_int32 norm1,
226 const vrpn_int32 norm2);
227 static char *encode_removeTriangle(vrpn_int32 &len, const vrpn_int32 objNum,
228 const vrpn_int32 triNum);
229 static char *encode_updateTrimeshChanges(vrpn_int32 &len,
230 const vrpn_int32 objNum,
231 const vrpn_float32 kspring,
232 const vrpn_float32 kdamp,
233 const vrpn_float32 fdyn,
234 const vrpn_float32 fstat);
235 static char *encode_setTrimeshType(vrpn_int32 &len, const vrpn_int32 objNum,
236 const vrpn_int32 type);
237 static char *encode_trimeshTransform(vrpn_int32 &len,
238 const vrpn_int32 objNum,
239 const vrpn_float32 homMatrix[16]);
240
241 //*added encodes*//
242 static char *encode_addObject(vrpn_int32 &len, const vrpn_int32 objNum,
243 const vrpn_int32 ParentNum);
244 static char *encode_addObjectExScene(vrpn_int32 &len,
245 const vrpn_int32 objNum);
246 static char *encode_objectPosition(vrpn_int32 &len, const vrpn_int32 objNum,
247 const vrpn_float32 Pos[3]);
248 static char *encode_objectOrientation(vrpn_int32 &len,
249 const vrpn_int32 objNum,
250 const vrpn_float32 axis[3],
251 const vrpn_float32 angle);
252 static char *encode_objectScale(vrpn_int32 &len, const vrpn_int32 objNum,
253 const vrpn_float32 Scale[3]);
254 static char *encode_removeObject(vrpn_int32 &len, const vrpn_int32 objNum);
255 static char *encode_clearTrimesh(vrpn_int32 &len, const vrpn_int32 objNum);
256 static char *encode_moveToParent(vrpn_int32 &len, const vrpn_int32 objNum,
257 const vrpn_int32 parentNum);
258
259 static char *encode_setHapticOrigin(vrpn_int32 &len,
260 const vrpn_float32 Pos[3],
261 const vrpn_float32 axis[3],
262 const vrpn_float32 angle);
263 static char *encode_setSceneOrigin(vrpn_int32 &len,
264 const vrpn_float32 Pos[3],
265 const vrpn_float32 axis[3],
266 const vrpn_float32 angle);
267 static char *encode_setHapticScale(vrpn_int32 &len,
268 const vrpn_float32 Scale);
269 static char *encode_setObjectIsTouchable(vrpn_int32 &len,
270 const vrpn_int32 objNum,
271 const vrpn_bool isTouchable);
272
273 static char *encode_forcefield(vrpn_int32 &len,
274 const vrpn_float32 origin[3],
275 const vrpn_float32 force[3],
276 const vrpn_float32 jacobian[3][3],
277 const vrpn_float32 radius);
278 static char *encode_error(vrpn_int32 &len, const vrpn_int32 error_code);
279
280 // DECODING
281 // ajout ONDIM
282 static vrpn_int32 decode_custom_effect(const char *buffer,
283 const vrpn_int32 len,
284 vrpn_uint32 *effectId,
285 vrpn_float32 **params,
286 vrpn_uint32 *nbParams);
287 // fin ajout ONDIM
288 static vrpn_int32 decode_force(const char *buffer, const vrpn_int32 len,
289 vrpn_float64 *force);
290 static vrpn_int32 decode_scp(const char *buffer, const vrpn_int32 len,
291 vrpn_float64 *pos, vrpn_float64 *quat);
292 static vrpn_int32 decode_plane(const char *buffer, const vrpn_int32 len,
293 vrpn_float32 *plane, vrpn_float32 *kspring,
294 vrpn_float32 *kdamp, vrpn_float32 *fdyn,
295 vrpn_float32 *fstat, vrpn_int32 *plane_index,
296 vrpn_int32 *n_rec_cycles);
297 static vrpn_int32 decode_surface_effects(
298 const char *buffer, const vrpn_int32 len, vrpn_float32 *k_adhesion_norm,
299 vrpn_float32 *k_adhesion_lat, vrpn_float32 *tex_amp,
300 vrpn_float32 *tex_wl, vrpn_float32 *buzz_amp, vrpn_float32 *buzz_freq);
301 static vrpn_int32 decode_vertex(const char *buffer, const vrpn_int32 len,
302 vrpn_int32 *objNum, vrpn_int32 *vertNum,
303 vrpn_float32 *x, vrpn_float32 *y,
304 vrpn_float32 *z);
305 static vrpn_int32 decode_normal(const char *buffer, const vrpn_int32 len,
306 vrpn_int32 *objNum, vrpn_int32 *vertNum,
307 vrpn_float32 *x, vrpn_float32 *y,
308 vrpn_float32 *z);
309 static vrpn_int32 decode_triangle(const char *buffer, const vrpn_int32 len,
310 vrpn_int32 *objNum, vrpn_int32 *triNum,
311 vrpn_int32 *vert0, vrpn_int32 *vert1,
312 vrpn_int32 *vert2, vrpn_int32 *norm0,
313 vrpn_int32 *norm1, vrpn_int32 *norm2);
314 static vrpn_int32 decode_removeTriangle(const char *buffer,
315 const vrpn_int32 len,
316 vrpn_int32 *objNum,
317 vrpn_int32 *triNum);
318 static vrpn_int32
319 decode_updateTrimeshChanges(const char *buffer, const vrpn_int32 len,
320 vrpn_int32 *objNum, vrpn_float32 *kspring,
321 vrpn_float32 *kdamp, vrpn_float32 *fdyn,
322 vrpn_float32 *fstat);
323 static vrpn_int32 decode_setTrimeshType(const char *buffer,
324 const vrpn_int32 len,
325 vrpn_int32 *objNum,
326 vrpn_int32 *type);
327 static vrpn_int32 decode_trimeshTransform(const char *buffer,
328 const vrpn_int32 len,
329 vrpn_int32 *objNum,
330 vrpn_float32 homMatrix[16]);
331
332 //*added decodes*//
333 static vrpn_int32 decode_addObject(const char *buffer, vrpn_int32 len,
334 vrpn_int32 *objNum,
335 vrpn_int32 *ParentNum);
336 static vrpn_int32 decode_addObjectExScene(const char *buffer,
337 vrpn_int32 len,
338 vrpn_int32 *objNum);
339 static vrpn_int32 decode_objectPosition(const char *buffer, vrpn_int32 len,
340 vrpn_int32 *objNum,
341 vrpn_float32 Pos[3]);
342 static vrpn_int32 decode_objectOrientation(const char *buffer,
343 vrpn_int32 len,
344 vrpn_int32 *objNum,
345 vrpn_float32 axis[3],
346 vrpn_float32 *angle);
347 static vrpn_int32 decode_objectScale(const char *buffer, vrpn_int32 len,
348 vrpn_int32 *objNum,
349 vrpn_float32 Scale[3]);
350 static vrpn_int32 decode_removeObject(const char *buffer, vrpn_int32 len,
351 vrpn_int32 *objNum);
352 static vrpn_int32 decode_clearTrimesh(const char *buffer, vrpn_int32 len,
353 vrpn_int32 *objNum);
354 static vrpn_int32 decode_moveToParent(const char *buffer, vrpn_int32 len,
355 vrpn_int32 *objNum,
356 vrpn_int32 *parentNum);
357
358 static vrpn_int32 decode_setHapticOrigin(const char *buffer, vrpn_int32 len,
359 vrpn_float32 Pos[3],
360 vrpn_float32 axis[3],
361 vrpn_float32 *angle);
362 static vrpn_int32 decode_setHapticScale(const char *buffer, vrpn_int32 len,
363 vrpn_float32 *Scale);
364 static vrpn_int32 decode_setSceneOrigin(const char *buffer, vrpn_int32 len,
365 vrpn_float32 Pos[3],
366 vrpn_float32 axis[3],
367 vrpn_float32 *angle);
368 static vrpn_int32 decode_setObjectIsTouchable(const char *buffer,
369 vrpn_int32 len,
370 vrpn_int32 *objNum,
371 vrpn_bool *isTouchable);
372
373 static vrpn_int32
374 decode_forcefield(const char *buffer, const vrpn_int32 len,
375 vrpn_float32 origin[3], vrpn_float32 force[3],
376 vrpn_float32 jacobian[3][3], vrpn_float32 *radius);
377 static vrpn_int32 decode_error(const char *buffer, const vrpn_int32 len,
378 vrpn_int32 *error_code);
379
380 // constraint encoding & decoding
381
382 static char *encode_enableConstraint(vrpn_int32 &len, vrpn_int32 enable);
383 static vrpn_int32 decode_enableConstraint(const char *buffer,
384 const vrpn_int32 len,
385 vrpn_int32 *enable);
386
387 static char *encode_setConstraintMode(vrpn_int32 &len,
388 ConstraintGeometry mode);
389 static vrpn_int32 decode_setConstraintMode(const char *buffer,
390 const vrpn_int32 len,
391 ConstraintGeometry *mode);
392
393 static char *encode_setConstraintPoint(vrpn_int32 &len, vrpn_float32 x,
394 vrpn_float32 y, vrpn_float32 z);
395 static vrpn_int32 decode_setConstraintPoint(const char *buffer,
396 const vrpn_int32 len,
397 vrpn_float32 *x,
398 vrpn_float32 *y,
399 vrpn_float32 *z);
400
401 static char *encode_setConstraintLinePoint(vrpn_int32 &len, vrpn_float32 x,
402 vrpn_float32 y, vrpn_float32 z);
403 static vrpn_int32 decode_setConstraintLinePoint(const char *buffer,
404 const vrpn_int32 len,
405 vrpn_float32 *x,
406 vrpn_float32 *y,
407 vrpn_float32 *z);
408
409 static char *encode_setConstraintLineDirection(vrpn_int32 &len,
410 vrpn_float32 x,
411 vrpn_float32 y,
412 vrpn_float32 z);
413 static vrpn_int32 decode_setConstraintLineDirection(const char *buffer,
414 const vrpn_int32 len,
415 vrpn_float32 *x,
416 vrpn_float32 *y,
417 vrpn_float32 *z);
418
419 static char *encode_setConstraintPlanePoint(vrpn_int32 &len, vrpn_float32 x,
420 vrpn_float32 y, vrpn_float32 z);
421 static vrpn_int32 decode_setConstraintPlanePoint(const char *buffer,
422 const vrpn_int32 len,
423 vrpn_float32 *x,
424 vrpn_float32 *y,
425 vrpn_float32 *z);
426
427 static char *encode_setConstraintPlaneNormal(vrpn_int32 &len,
428 vrpn_float32 x, vrpn_float32 y,
429 vrpn_float32 z);
430 static vrpn_int32 decode_setConstraintPlaneNormal(const char *buffer,
431 const vrpn_int32 len,
432 vrpn_float32 *x,
433 vrpn_float32 *y,
434 vrpn_float32 *z);
435
436 static char *encode_setConstraintKSpring(vrpn_int32 &len, vrpn_float32 k);
437 static vrpn_int32 decode_setConstraintKSpring(const char *buffer,
438 const vrpn_int32 len,
439 vrpn_float32 *k);
440
441 // utility functions
442
443 static char *encodePoint(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y,
444 vrpn_float32 z);
445 static vrpn_int32 decodePoint(const char *buffer, const vrpn_int32 len,
446 vrpn_float32 *x, vrpn_float32 *y,
447 vrpn_float32 *z);
448
449 struct timeval timestamp;
450
451 vrpn_int32 which_plane;
452
453 vrpn_float64 d_force[3];
456
457 vrpn_float64 scp_pos[3];
458 vrpn_float64 scp_quat[4]; // for torque
459 vrpn_float32 plane[4];
460
461 vrpn_float32 ff_origin[3];
462 vrpn_float32 ff_force[3];
463 vrpn_float32 ff_jacobian[3][3]; // J[i][j] = dF[i]/dx[j]
464 vrpn_float32 ff_radius;
465
466 vrpn_float32 SurfaceKspring;
467 vrpn_float32 SurfaceKdamping;
468 vrpn_float32 SurfaceFstatic;
469 vrpn_float32 SurfaceFdynamic;
470 vrpn_int32 numRecCycles;
471 vrpn_int32 errorCode;
472
473 vrpn_float32 SurfaceKadhesionLateral;
474 vrpn_float32 SurfaceKadhesionNormal;
475 vrpn_float32 SurfaceBuzzFreq;
476 vrpn_float32 SurfaceBuzzAmp;
477 vrpn_float32 SurfaceTextureWavelength;
478 vrpn_float32 SurfaceTextureAmplitude;
479
480 // ajout ONDIM
481 vrpn_int32 customEffectId;
482 vrpn_float32 *customEffectParams;
483 vrpn_uint32 nbCustomEffectParams;
484 // fin ajout ONDIM
485};
486
487// User routine to handle position reports for surface contact point (SCP)
488// This is in vrpn_ForceDevice rather than vrpn_Tracker because only
489// a force feedback device should know anything about SCPs as this is a
490// part of the force feedback model. It may be preferable to use the SCP
491// rather than the tracker position for graphics so the hand position
492// doesn't appear to go below the surface making the surface look very
493// compliant.
494typedef struct _vrpn_FORCESCPCB {
495 struct timeval msg_time; // Time of the report
496 vrpn_float64 pos[3]; // position of SCP
497 vrpn_float64 quat[4]; // orientation of SCP
499typedef void(VRPN_CALLBACK *vrpn_FORCESCPHANDLER)(void *userdata,
500 const vrpn_FORCESCPCB info);
501
502typedef struct _vrpn_FORCECB {
503 struct timeval msg_time; // Time of the report
504 vrpn_float64 force[3]; // force value
506typedef void(VRPN_CALLBACK *vrpn_FORCECHANGEHANDLER)(void *userdata,
507 const vrpn_FORCECB info);
508
509typedef struct _vrpn_FORCEERRORCB {
510 struct timeval msg_time; // time of the report
511 vrpn_int32 error_code; // type of error
513typedef void(VRPN_CALLBACK *vrpn_FORCEERRORHANDLER)(
514 void *userdata, const vrpn_FORCEERRORCB info);
515
517public:
518 // The name of the force device to connect to.
519 // The connection argument is used only if you already have a connection
520 // the device must listen on (it is not normally used).
521 vrpn_ForceDevice_Remote(const char *name, vrpn_Connection *cn = NULL);
522 virtual ~vrpn_ForceDevice_Remote(void);
523
524 void sendSurface(void);
525 void startSurface(void);
526 void stopSurface(void);
527
530 // vertNum normNum and triNum start at 0
531 void setVertex(vrpn_int32 vertNum, vrpn_float32 x, vrpn_float32 y,
532 vrpn_float32 z);
533 // NOTE: ghost doesn't take normals,
534 // and normals still aren't implemented for Hcollide
535 void setNormal(vrpn_int32 normNum, vrpn_float32 x, vrpn_float32 y,
536 vrpn_float32 z);
537 void setTriangle(vrpn_int32 triNum, vrpn_int32 vert0, vrpn_int32 vert1,
538 vrpn_int32 vert2, vrpn_int32 norm0 = -1,
539 vrpn_int32 norm1 = -1, vrpn_int32 norm2 = -1);
540 void removeTriangle(vrpn_int32 triNum);
541 // should be called to incorporate the above changes into the
542 // displayed trimesh
543 void updateTrimeshChanges();
544 // set the trimesh's homogen transform matrix (in row major order)
545 void setTrimeshTransform(vrpn_float32 homMatrix[16]);
546 void clearTrimesh(void);
547
550 // Add an object to the haptic scene as root (parent -1 = default) or as
551 // child (ParentNum =the number of the parent)
552 void addObject(vrpn_int32 objNum, vrpn_int32 ParentNum = -1);
553 // Add an object next to the haptic scene as root
554 void addObjectExScene(vrpn_int32 objNum);
555 // vertNum normNum and triNum start at 0
556 void setObjectVertex(vrpn_int32 objNum, vrpn_int32 vertNum, vrpn_float32 x,
557 vrpn_float32 y, vrpn_float32 z);
558 // NOTE: ghost doesn't take normals,
559 // and normals still aren't implemented for Hcollide
560 void setObjectNormal(vrpn_int32 objNum, vrpn_int32 normNum, vrpn_float32 x,
561 vrpn_float32 y, vrpn_float32 z);
562 void setObjectTriangle(vrpn_int32 objNum, vrpn_int32 triNum,
563 vrpn_int32 vert0, vrpn_int32 vert1, vrpn_int32 vert2,
564 vrpn_int32 norm0 = -1, vrpn_int32 norm1 = -1,
565 vrpn_int32 norm2 = -1);
566 void removeObjectTriangle(vrpn_int32 objNum, vrpn_int32 triNum);
567 // should be called to incorporate the above changes into the
568 // displayed trimesh
569 void updateObjectTrimeshChanges(vrpn_int32 objNum);
570 // set the trimesh's homogen transform matrix (in row major order)
571 void setObjectTrimeshTransform(vrpn_int32 objNum,
572 vrpn_float32 homMatrix[16]);
573 // set position of an object
574 void setObjectPosition(vrpn_int32 objNum, vrpn_float32 Pos[3]);
575 // set orientation of an object
576 void setObjectOrientation(vrpn_int32 objNum, vrpn_float32 axis[3],
577 vrpn_float32 angle);
578 // set Scale of an object only x scale is supported at the moment
579 void setObjectScale(vrpn_int32 objNum, vrpn_float32 Scale[3]);
580 // remove an object from the scene
581 void removeObject(vrpn_int32 objNum);
582 void clearObjectTrimesh(vrpn_int32 objNum);
583
586 // Change The parent of an object
587 void moveToParent(vrpn_int32 objNum, vrpn_int32 ParentNum);
588 // Set the Origin of the haptic device
589 void setHapticOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3],
590 vrpn_float32 angle);
591 // Set the scale factor of the haptic device
592 void setHapticScale(vrpn_float32 Scale);
593 // Set the Origin of the scene
594 void setSceneOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3],
595 vrpn_float32 angle);
596 // get new ID, use only if wish to use vrpn ids and do not want to manage
597 // them yourself: ids need to be unique
598 vrpn_int32 getNewObjectID();
599 // make an object touchable or not
600 void setObjectIsTouchable(vrpn_int32 objNum, vrpn_bool IsTouchable = true);
601
602 // the next time we send a trimesh we will use the following type
603 void useHcollide();
604 void useGhost();
605
606 // Generalized constraint code.
607 // Constrains as a spring connected to a point, sliding along a line
608 // (constraint forces in a plane perpendicular to the line), or
609 // sliding along a plane (constraint forces only along the plane's
610 // normal). LineDirection and PlaneNormal should be normalized
611 // (vector length == 1).
612
613 // Constraints are implemented as force fields, so both cannot
614 // run at once.
615
616 // XXX it would be safer if changes (especially enable/disable)
617 // had better relaxation support
618
619 void enableConstraint(vrpn_int32 enable); // zero disables
620 void setConstraintMode(ConstraintGeometry mode);
621 void setConstraintPoint(vrpn_float32 point[3]);
622 void setConstraintLinePoint(vrpn_float32 point[3]);
623 void setConstraintLineDirection(vrpn_float32 direction[3]);
624 void setConstraintPlanePoint(vrpn_float32 point[3]);
625 void setConstraintPlaneNormal(vrpn_float32 normal[3]);
626 void setConstraintKSpring(vrpn_float32 k);
627
628 // void sendConstraint (vrpn_int32 enable, vrpn_float32 x,
629 // vrpn_float32 y, vrpn_float32 z, vrpn_float32 kSpr);
630
631 // At the <origin> of the field, user feels the specified <force>.
632 // As the user moves away from the origin, the force felt changes
633 // according to the jacobian. If the user moves further than <radius>
634 // from <origin>, the field cuts out.
635
636 // XXX it would be safer for the field to attenuate rapidly
637 // from the value at the radius if the user moves beyond the radius
638
639 void sendForceField(vrpn_float32 origin[3], vrpn_float32 force[3],
640 vrpn_float32 jacobian[3][3], vrpn_float32 radius);
641 void sendForceField(void);
642 void stopForceField(void);
643
644 // ajout ONDIM
645 void startEffect(void);
646 void stopEffect(void);
647 // fin ajout ONDIM
648
649 // This routine calls the mainloop of the connection it is on
650 virtual void mainloop();
651
652 // (un)Register a callback handler to handle a force change
653 // and plane equation change and trimesh change
654 virtual int register_force_change_handler(void *userdata,
655 vrpn_FORCECHANGEHANDLER handler)
656 {
657 return d_change_list.register_handler(userdata, handler);
658 };
659 virtual int unregister_force_change_handler(void *userdata,
660 vrpn_FORCECHANGEHANDLER handler)
661 {
662 return d_change_list.unregister_handler(userdata, handler);
663 };
664
665 virtual int register_scp_change_handler(void *userdata,
666 vrpn_FORCESCPHANDLER handler)
667 {
668 return d_scp_change_list.register_handler(userdata, handler);
669 };
670 virtual int unregister_scp_change_handler(void *userdata,
671 vrpn_FORCESCPHANDLER handler)
672 {
673 return d_scp_change_list.unregister_handler(userdata, handler);
674 };
675
676 virtual int register_error_handler(void *userdata,
677 vrpn_FORCEERRORHANDLER handler)
678 {
679 return d_error_change_list.register_handler(userdata, handler);
680 };
681 virtual int unregister_error_handler(void *userdata,
682 vrpn_FORCEERRORHANDLER handler)
683 {
684 return d_error_change_list.unregister_handler(userdata, handler);
685 };
686
687protected:
689 static int VRPN_CALLBACK
690 handle_force_change_message(void *userdata, vrpn_HANDLERPARAM p);
691
692 vrpn_Callback_List<vrpn_FORCESCPCB> d_scp_change_list;
693 static int VRPN_CALLBACK
694 handle_scp_change_message(void *userdata, vrpn_HANDLERPARAM p);
695
696 vrpn_Callback_List<vrpn_FORCEERRORCB> d_error_change_list;
697 static int VRPN_CALLBACK
698 handle_error_change_message(void *userdata, vrpn_HANDLERPARAM p);
699
700 // constraint types
701
702 vrpn_int32 d_conEnabled;
703 ConstraintGeometry d_conMode;
704 vrpn_float32 d_conPoint[3];
705 vrpn_float32 d_conLinePoint[3];
706 vrpn_float64 d_conLineDirection[3]; // (assumed) normalized
707 vrpn_float32 d_conPlanePoint[3];
708 vrpn_float64 d_conPlaneNormal[3]; // (assumed) normalized
709 vrpn_float32 d_conKSpring;
710
711 // haptic scene variables
712 vrpn_int32 m_NextAvailableObjectID;
713
714 // utility functions
715
716 void send(const char *msgbuf, vrpn_int32 len, vrpn_int32 type);
717// Takes a pointer to a buffer, the length of the buffer, and the
718// vrpn message type id to send. Sends the buffer reliably
719// over connection AND DELETES THE BUFFER.
720
721#ifdef FD_SPRINGS_AS_FIELDS
722
723 void constraintToForceField(void);
724// takes the current cs_* settings and translates them into
725// a force field.
726
727#endif // FD_SPRINGS_AS_FIELDS
728};
729
730#endif
定义 vrpn_BaseClass.h:310
定义 vrpn_BaseClass.h:361
Generic connection class not specific to the transport mechanism.
定义 vrpn_Connection.h:562
定义 vrpn_ForceDevice.h:516
void moveToParent(vrpn_int32 objNum, vrpn_int32 ParentNum)
void setVertex(vrpn_int32 vertNum, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
virtual void mainloop()
void addObject(vrpn_int32 objNum, vrpn_int32 ParentNum=-1)
定义 vrpn_ForceDevice.h:39
virtual int register_types(void)
定义 vrpn_ForceDevice.h:502
定义 vrpn_ForceDevice.h:509
定义 vrpn_ForceDevice.h:494
This structure is what is passed to a vrpn_Connection message callback.
定义 vrpn_Connection.h:41