                 CATransform3DConcat(perspective,CATransform3DMakeRotation(CGFloat(M_PI), 1, 0, 0)))
             animation.duration = CFTimeInterval(duration)
             animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)
+            animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
             layer.addAnimation(animation, forKey: "3d")
         case "morph":
             let morphX = CAKeyframeAnimation()

                CATransform3DConcat(perspective, CATransform3DMakeRotation(CGFloat(M_PI), 0, 1, 0)))
            animation.duration = CFTimeInterval(duration)
            animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)
            layer.addAnimation(animation, forKey: "3d")
        case "flipY":
            var perspective = CATransform3DIdentity

            scaleY = 2*force
        case "fall":
            isFrom = false
            rotate = 15 * CGFloat(M_PI/180)
            y = 300*force
        case "shake":
            let animation = CAKeyframeAnimation()
            animation.keyPath = "position.x"
