12 #define M_PI 3.14159265358979323846
21 d_vel_scale_value(1.0),
23 d_rot_scale_value(1.0),
24 d_update_interval (update_rate ? (1/update_rate) : 1.0),
25 d_reportChanges (reportChanges)
34 for (i = 0; i < params->
num_axes; i++) {
35 d_axes[i].axis = params->
axes[i];
36 d_axes[i].active =
false;
38 setup_channel(&d_axes[i]);
66 if (d_vel_scale == NULL) {
67 fprintf(stderr,
"vrpn_Tracker_ButtonFly: "
71 d_vel_scale->register_change_handler(
this, handle_velocity_update);
94 if (d_rot_scale == NULL) {
95 fprintf(stderr,
"vrpn_Tracker_ButtonFly: "
99 d_rot_scale->register_change_handler(
this, handle_rotation_update);
107 register_autodeleted_handler(d_connection->register_message_type
109 handle_newConnection,
this);
114 for ( i =0; i< 4; i++)
115 for (
int j=0; j< 4; j++)
116 d_initMatrix[i][j] = 0;
118 d_initMatrix[0][0] = d_initMatrix[1][1] = d_initMatrix[2][2] =
119 d_initMatrix[3][3] = 1.0;
157 printf(
"vrpn_Tracker_ButtonFly: Adding local button %s\n",
163 printf(
"vrpn_Tracker_ButtonFly: Adding remote button %s\n",
167 if (full->
btn == NULL) {
168 fprintf(stderr,
"vrpn_Tracker_ButtonFly: "
169 "Can't open Button %s\n",full->
axis.
name);
185 if (full->
btn == NULL) {
return 0; }
208 double value_abs = fabs(value_scaled);
209 double value_powered;
212 if (value_offset >=0) {
234 double value_abs = fabs(value_scaled);
235 double value_powered;
238 if (value_offset >=0) {
267 if (info.
state == 1) {
268 double tx,ty,tz, rx,ry,rz;
269 q_matrix_type newMatrix;
281 q_euler_to_col_matrix(newMatrix, rz, ry, rx);
282 newMatrix[3][0] = tx; newMatrix[3][1] = ty; newMatrix[3][2] = tz;
311 printf(
"Get a new connection, reset virtual_Tracker\n");
374 fprintf(stderr,
"Tracker ButtonFly: cannot write message: tossing\n");
377 fprintf(stderr,
"Tracker ButtonFly: No valid connection\n");
405 (
double time_interval)
407 double tx,ty,tz, rx,ry,rz;
414 tx = ty = tz = rx = ry = rz = 0.0;
416 for (i = 0; i < d_num_axes; i++) {
417 if (d_axes[i].active && !d_axes[i].axis.absolute) {
418 tx += d_axes[i].axis.vec[0] * time_interval * d_vel_scale_value;
419 ty += d_axes[i].axis.vec[1] * time_interval * d_vel_scale_value;
420 tz += d_axes[i].axis.vec[2] * time_interval * d_vel_scale_value;
422 rx = d_axes[i].axis.rot[0] * time_interval * (2*
M_PI) * d_rot_scale_value;
423 ry = d_axes[i].axis.rot[1] * time_interval * (2*
M_PI) * d_rot_scale_value;
424 rz = d_axes[i].axis.rot[2] * time_interval * (2*
M_PI) * d_rot_scale_value;
429 q_euler_to_col_matrix(diffM, rz, ry, rx);
430 diffM[3][0] = tx; diffM[3][1] = ty; diffM[3][2] = tz;
436 q_matrix_mult(
final, diffM, d_currentMatrix);
437 q_matrix_copy(d_currentMatrix,
final);
438 convert_matrix_to_tracker();
448 for (i=0; i< 3; i++) {
451 for (i=0; i< 4; i++) {
457 (
double elapsedInterval) {
466 for (i = 0; i < d_num_axes; i++) {
467 if (d_axes[i].active && d_axes[i].axis.absolute) {
469 d_axes[i].active =
false;
477 if (elapsedInterval < d_update_interval) {
483 if (!d_reportChanges) {
489 for (i = 0; i < d_num_axes; i++) {
490 if (d_axes[i].active && !d_axes[i].axis.absolute) {