void Camera::drag(int x, int y) { if(!isDragging) return; currentVector = ProjectToSphere(ScreenToNDC(x, y)); vector3df axis = startVector.crossProduct(currentVector); float theta = acos(startVector.dotProduct(currentVector)); quaternion delta(axis.x, axis.y, axis.z, -theta); currentQuat = delta * startQuat; }
void Camera::Rotate( int from_x, int from_y, int to_x, int to_y, int width, int height) { ElVisFloat from_x_pos = 2.0 * static_cast<ElVisFloat>(from_x) / static_cast<ElVisFloat>(width) - 1.0; ElVisFloat from_y_pos = 1.0 - 2.0 * static_cast<ElVisFloat>(from_y) / static_cast<ElVisFloat>(height); ElVisFloat to_x_pos = 2.0 * static_cast<ElVisFloat>(to_x) / static_cast<ElVisFloat>(width) - 1.0; ElVisFloat to_y_pos = 1.0 - 2.0 * static_cast<ElVisFloat>(to_y) / static_cast<ElVisFloat>(height); ElVisFloat3 to = ProjectToSphere(from_x_pos, from_y_pos, 0.8); ElVisFloat3 from = ProjectToSphere(to_x_pos, to_y_pos, .8); Matrix4x4 m = RotationMatrix(to, from); Transform(m, true); OnCameraChanged(); }
void Camera::beginDrag(int x, int y) { startVector = ProjectToSphere(ScreenToNDC(x, y)); startQuat = currentQuat; isDragging = true; }