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;
	}

}
Esempio n. 2
0
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);

}