public static void MoveWithMouseWheel(this PerspectiveCamera camera, double delta, Point3D center) { delta = camera.GetRadius() / 10 * (delta > 0 ? 1 : -1); double k = Math.Max(Math.Abs(camera.Position.X), Math.Max(Math.Abs(camera.Position.Y), Math.Abs(camera.Position.Z))); Point3D newPosition = new Point3D(camera.LookDirection.X * delta / k + camera.Position.X, camera.LookDirection.Y * delta / k + camera.Position.Y, camera.LookDirection.Z * delta / k + camera.Position.Z); double r = Math.Sqrt(Math.Pow(newPosition.X - center.X, 2) + Math.Pow(newPosition.Y - center.Y, 2) + Math.Pow(newPosition.Z - center.Z, 2)); if (r > 1) { camera.LookDirection = (camera.Position + camera.LookDirection) - newPosition; camera.Position = newPosition; camera.UpDirection = new Vector3D(0, 0, 1); } }