首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能在SceneKit中计算时间表的“时间”变量的正弦?

是否有可能在SceneKit中计算时间表的“时间”变量的正弦?
EN

Stack Overflow用户
提问于 2018-05-19 10:32:46
回答 2查看 197关注 0票数 0

我需要一个乒乓球运动沿X轴的三维立方体。因此,我将三角函数sine函数应用到time变量中,作为x参数。但没有乒乓球运动,只有标量运动。

任何帮助都很感激!

代码语言:javascript
复制
override func awakeFromNib() {
    super.awakeFromNib()

    .......

    //CFTimeInterval derived by calling `mach_absolute_time()` and converting the result to seconds.
    let t = CACurrentMediaTime()

    animation.toValue = NSValue(SCNVector3: SCNVector3(x: CGFloat(sin(t)*5), 
                                                       y: CGFloat(0), 
                                                       z: CGFloat(0)))

    animation.duration = 60
    animation.repeatCount = MAXFLOAT    
    cube.addAnimation(animation, forKey: nil)
}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-28 11:35:31

在SceneKit中可以计算时间的正弦曲线。为此,我需要为SCNAction创建一个扩展(在SWIFT4.1中):

代码语言:javascript
复制
let pi = CGFloat(Double.pi)

extension SCNAction {

    static func oscillation(amplitude a: CGFloat, 
                           timePeriod t: CGFloat) -> SCNAction {

        let action = SCNAction.customAction(duration: Double(t)) { node, currentTime in
            let offset = a * sin(2 * pi * currentTime / t)
            node.position.x = offset
        }
        return action
    }
}

class GameViewController: NSViewController, SCNSceneRendererDelegate {

    let box = SCNNode()
    // ..................

    override func viewDidLoad() {
        super.viewDidLoad()

        // ..................
        box.geometry = SCNBox()
        scene.rootNode.addChildNode(box)

        let oscillate = SCNAction.oscillation(amplitude: 4, timePeriod: 1)
        box.runAction(SCNAction.repeatForever(oscillate))
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-05-19 13:03:24

以下代码的问题是,它是在动画实例化时执行的,而不是在计算动画时执行的。这就是sin(t)的值永远不会随着时间的推移而改变。它被评估一次,结果将是线性插值的最终值。

代码语言:javascript
复制
let t = CACurrentMediaTime()
animation.toValue = NSValue(SCNVector3: SCNVector3(x: CGFloat(sin(t)*5), 
                                                   y: CGFloat(0), 
                                                   z: CGFloat(0)))

相反,CAAnimation类公开timingFunction属性,这很可能是您想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50424306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档