00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #if defined(VMDVRPN)
00024
00025 #include "P_VRPNTracker.h"
00026
00027 #include "quat.h"
00028 #include "Matrix4.h"
00029 #include "utilities.h"
00030
00031
00032 #if !defined(VRPN_CALLBACK)
00033 #define VRPN_CALLBACK
00034 #endif
00035
00036
00037 static void VRPN_CALLBACK handle_vrpn_tracker(void *userdata, const vrpn_TRACKERCB t) {
00038 VRPNTrackerUserData *data = (VRPNTrackerUserData *)userdata;
00039
00040 data->pos[0] = (float) t.pos[0];
00041 data->pos[1] = (float) t.pos[1];
00042 data->pos[2] = (float) t.pos[2];
00043
00044 double q[4];
00045 q[0] = -t.quat[Q_Z];
00046 q[1] = t.quat[Q_Y];
00047 q[2] = t.quat[Q_X];
00048 q[3] = t.quat[Q_W];
00049
00050 double rotation[16];
00051 Matrix4 *orient = data->orient;
00052 int i;
00053 q_to_ogl_matrix(rotation, q);
00054 for(i=0;i<4;i++) orient->mat[4*0+i]=(float)rotation[i];
00055 for(i=0;i<4;i++) orient->mat[4*1+i]=(float)rotation[i+4];
00056 for(i=0;i<4;i++) orient->mat[4*2+i]=(float)rotation[i+8];
00057 for(i=0;i<4;i++) orient->mat[4*3+i]=(float)rotation[i+12];
00058 }
00059
00060 VRPNTracker::VRPNTracker() {
00061 tkr = NULL;
00062
00063
00064 userdata.pos = pos;
00065 userdata.orient = orient;
00066 }
00067
00068 int VRPNTracker::do_start(const SensorConfig *config) {
00069 if (tkr) return 0;
00070 if (!config->have_one_sensor()) return 0;
00071
00072 char myUSL[100];
00073 config->make_vrpn_address(myUSL);
00074 int mysensor = (*config->getsensors())[0];
00075
00076
00077 tkr = new vrpn_Tracker_Remote(myUSL);
00078
00079
00080 tkr->register_change_handler(&userdata, handle_vrpn_tracker,
00081 mysensor);
00082 return 1;
00083 }
00084
00085 VRPNTracker::~VRPNTracker(void) {
00086 delete tkr;
00087 }
00088
00089 void VRPNTracker::update() {
00090
00091 if(!alive()) {
00092 moveto(0,0,0);
00093 orient->identity();
00094 return;
00095 }
00096 tkr->mainloop();
00097 }
00098
00099 #endif
00100
00101