// // applyCameraAngle() // Rotation to match omni frame with camera view. // // Precondition: pos is a position vector in the Omni frame. // Postcondition: pos is a position vector in the camera view frame. // void applyCameraAngle(hduMatrix &xform){ double c1 = cos(-th1*DEGREES), c2 = cos(-th2*DEGREES), c3 = cos(th3*DEGREES); double s1 = sin(-th1*DEGREES), s2 = sin(-th2*DEGREES), s3 = sin(th3*DEGREES); hduMatrix R( c1*c3+s1*s2*s3 , c3*s1*s2-c1*s3 , c2*s1 , 0, c2*s3 , c2*c3 , -1*s2 , 0, c1*s2*s3-c3*s1 , c1*c3*s2+s1*s3 , c1*c2 , 0, 0 , 0 , 0 , 1); xform = xform.multRight(R); // Print rotation matrix //cout << R[0][0] << "\t" << R[0][1] << "\t" << R[0][2] << "\n"; //cout << R[1][0] << "\t" << R[1][1] << "\t" << R[1][2] << "\n"; //cout << R[2][0] << "\t" << R[2][1] << "\t" << R[2][2] << "\n" <<"\n"; // Matrix-vector multiply R.p //for (int i = 0; i<4; i++){ // temp[i]=0; // for (int j=0; j<4; j++){ // temp[i] += R[i][j]*pos[3][j]; // } //} //// Set output //for (int i = 0; i<3; i++){ // pos[3][i] = temp[i]; //} }
void omni2ITPTransform(hduMatrix & xform) { const hduMatrix omni2ITP_x( 0 , 1 , 0 , 0 , 0 , 0 , -1 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ); const hduMatrix omni2ITP( 0 , 0 , -1 , 0 , 1 , 0 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 1 ); xform.multRight(omni2ITP); }
void omni2ITPTransform(hduMatrix & xform , int devID) { if (devID == OMNI1){ const hduMatrix omni2ITP( 0 , 1 , 0 , 0 , 0 , 0 , -1 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ); xform.multRight(omni2ITP); } if (devID == OMNI2){ const hduMatrix omni2ITP( 0 , 1 , 0 , 0 , 0 , 0 , -1 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ); xform.multRight(omni2ITP); } /*const hduMatrix omni2ITP_x( 0 , 0 , -1 , 0 , 1 , 0 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 1 );*/ }
/******************************************************************************* GLUT callback for mouse motion, which is used for controlling the view rotation and scaling. *******************************************************************************/ void glutMotion(int x, int y) { if (gIsRotatingCamera) { static const double kTrackBallRadius = 0.8; hduVector3Dd lastPos; lastPos[0] = gLastMouseX * 2.0 / gWindowWidth - 1.0; lastPos[1] = (gWindowHeight - gLastMouseY) * 2.0 / gWindowHeight - 1.0; lastPos[2] = projectToTrackball(kTrackBallRadius, lastPos[0], lastPos[1]); hduVector3Dd currPos; currPos[0] = x * 2.0 / gWindowWidth - 1.0; currPos[1] = (gWindowHeight - y) * 2.0 / gWindowHeight - 1.0; currPos[2] = projectToTrackball(kTrackBallRadius, currPos[0], currPos[1]); currPos.normalize(); lastPos.normalize(); hduVector3Dd rotateVec = lastPos.crossProduct(currPos); double rotateAngle = asin(rotateVec.magnitude()); if (!hduIsEqual(rotateAngle, 0.0, DBL_EPSILON)) { hduMatrix deltaRotation = hduMatrix::createRotation( rotateVec, rotateAngle); gCameraRotation.multRight(deltaRotation); updateCamera(); } } else if (gIsScalingCamera) { float y1 = gWindowHeight - gLastMouseY; float y2 = gWindowHeight - y; gCameraScale *= 1 + (y1 - y2) / gWindowHeight; updateCamera(); } gLastMouseX = x; gLastMouseY = y; }