void Camera::dragMouse( int x, int y ) { Vec3f mouseDelta = Vec3f(x,y,0.0f) - mLastMousePosition; mLastMousePosition = Vec3f(x,y,0.0f); switch(mCurrentMouseAction) { case kActionTranslate: { calculateViewingTransformParameters(); double xTrack = -mouseDelta[0] * kMouseTranslationXSensitivity; double yTrack = mouseDelta[1] * kMouseTranslationYSensitivity; Vec3f transXAxis = mUpVector ^ (mPosition - mLookAt); transXAxis /= sqrt((transXAxis*transXAxis)); Vec3f transYAxis = (mPosition - mLookAt) ^ transXAxis; transYAxis /= sqrt((transYAxis*transYAxis)); setLookAt(getLookAt() + transXAxis*xTrack + transYAxis*yTrack); break; } case kActionRotate: { float dAzimuth = -mouseDelta[0] * kMouseRotationSensitivity; float dElevation = mouseDelta[1] * kMouseRotationSensitivity; setAzimuth(getAzimuth() + dAzimuth); setElevation(getElevation() + dElevation); if (getAzimuth() > M_PI) mAzimuth -= 2.0*M_PI; if (getElevation() > M_PI) mElevation -= 2.0*M_PI; fprintf(stderr, "az %f, elev %f\n", mAzimuth, mElevation); break; } case kActionZoom: { float dDolly = -mouseDelta[1] * kMouseZoomSensitivity; setDolly(getDolly() + dDolly); break; } case kActionTwist: // Not implemented default: break; } }
void Camera::dragMouse( int x, int y ) { Vec3f mouseDelta = Vec3f(x,y,0.0f) - mLastMousePosition; switch(mCurrentMouseAction) { case kActionTranslate: { // Determine mouse movement double xTrack = -mouseDelta[0] * kMouseTranslationXSensitivity; double yTrack = mouseDelta[1] * kMouseTranslationYSensitivity; // Recalculate stuff if needed if (m_bDirtyTransform) { updateTransform(); } // Determine directions of motion in scene space Vec3f direction = m_vPosition - m_vLookAt; Vec3f transXAxis = m_vUpVector ^ direction; transXAxis /= sqrt((transXAxis*transXAxis)); Vec3f transYAxis = direction ^ transXAxis; transYAxis /= sqrt((transYAxis*transYAxis)); // Move the camera's look-at point setLookAt(getLookAt() + transXAxis*xTrack + transYAxis*yTrack); break; } case kActionRotate: { // Store the rotation in this quarternion float quat[4]; // Get the mouse coordinates in a range between -1.0 and 1.0 float viewHalfWidth = (m_iViewportWidth / 2.f), viewHalfHeight = (m_iViewportHeight / 2.f); float oldX = mLastMousePosition[0] * 2.f / (m_iViewportWidth - 1) - 1.f, oldY = mLastMousePosition[1] * 2.f / (m_iViewportHeight - 1) - 1.f, newX = x * 2.f / (m_iViewportWidth - 1) - 1.f, newY = y * 2.f / (m_iViewportHeight - 1) - 1.f; // Get the quaternion to rotate around, from the trackball code. trackball( quat, oldX, -oldY, newX, -newY ); // Add the new quaternion to the current one. float oldQuat[4]; memcpy(oldQuat, m_fQuat, sizeof(float) * 4); //add_quats(oldQuat, quat, m_fQuat); add_quats(quat, oldQuat, m_fQuat); // Update the transform parameters. updateTransform(); break; } case kActionZoom: { // Determine dolly movement. float fDollyDelta = -mouseDelta[1] * kMouseZoomSensitivity; // Add to dolly setDolly(getDolly() + fDollyDelta); updateTransform(); break; } case kActionTwist: { break; } default: break; } mLastMousePosition = Vec3f(x,y,0.0f); }