gpt4 book ai didi

swift - 根据摩擦和张力确定 springWithDamping 和 initialSpringVelocity

转载 作者:搜寻专家 更新时间:2023-10-30 22:29:20 24 4
gpt4 key购买 nike

我的设计团队使用摩擦和张力为我们提供动画参数。例如:

Has a spring affect (280 tension and 20.5 friction) Over 0.3 seconds

不幸的是,我一直在猜测这些值会转换成什么,并观察它,如果看起来很接近,我就会将其发送过去,他们会批准。但是不断构建具有不同值的项目所花费的时间非常耗时。必须有更简单的方法。

我找到了 Framer在 Github 上,它让我相信阻尼可以这样计算:

let damping: CGFloat = 20.5 / (2 * (1 * 280)).squareRoot()

但是,我似乎无法弄清楚如何根据摩擦力和张力来计算速度。有没有更简单的方法可以为这个开发人员节省一些宝贵的时间?

动画示例:

UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: damping,
initialSpringVelocity: ???, options: .curveEaseIn, animations: { // Do Stuff })

最佳答案

您说得对,您链接到的代码可用于计算阻尼比(我受宠若惊,因为我是编写它的人;)。不过,您的派生 Swift 代码似乎有错误。我认为应该是(注意括号中的区别):

let damping: CGFloat = 20.5 / (2 * (1 * 280).squareRoot())

只有当你想在开始动画时给对象一些初始速度时才需要速度值。这样做的用例是对象在开始动画时已经在移动(例如,在拖动交互后开始动画时)。

因此,如果对象从非移动状态开始动画,您可以只使用 0 作为初始速度。

我对您的设计团队给您的紧张、摩擦 持续时间感到困惑。因为 Spring 是模拟物理,所以张力和摩擦力将模拟在特定持续时间后停止动画的 Spring 。张力 280 和摩擦力 20.5 的 Spring 导致持续时间接近 0.65,而不是 0.3。 (参见 Framer 中的 computeDuration 函数如何根据张力和摩擦计算持续时间)。这是 coffeescript 版本:

# Tries to compute the duration of a spring,
# but can't for certain velocities and if dampingRatio >= 1
# In those cases it will return null
exports.computeDuration = (tension, friction, velocity = 0, mass = 1) ->
dampingRatio = computeDampingRatio(tension, friction)
undampedFrequency = Math.sqrt(tension / mass)
# This is basically duration extracted out of the envelope functions
if dampingRatio < 1
a = Math.sqrt(1 - Math.pow(dampingRatio, 2))
b = velocity / (a * undampedFrequency)
c = dampingRatio / a
d = - ((b - c) / epsilon)
if d <= 0
return null
duration = Math.log(d) / (dampingRatio * undampedFrequency)
else
return null
return duration

您可以为 iOS 使用的 Spring 指定持续时间的原因是,它会根据阻尼比和持续时间计算 Spring 的张力和摩擦力。在引擎盖下,它仍将使用张力和摩擦力进行 Spring 模拟。要深入了解该代码在 iOS 中的工作方式,请查看 computeDerivedCurveOptions在 Framer 中,它是 iOS 使用的代码的直接端口(通过反汇编和分析 iOS 二进制文件创建)。

关于swift - 根据摩擦和张力确定 springWithDamping 和 initialSpringVelocity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50029666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com