【问题标题】:SceneKit material blinkingSceneKit 材质闪烁
【发布时间】:2018-10-12 09:49:41
【问题描述】:

我想让一个节点闪烁(例如,从输入颜色循环到当前的 firstMaterial)。该节点具有与许多其他节点共享的材料,但我不希望所有节点都闪烁(仅选定节点)。

我成功做到了没有 SCNAction/SCNTransaction,但代码很脏,很难维护,必须在 Update() 中调用...我想知道 SCNAction/SCNTransaction 是否可以帮助我但我不知道如何以正确的方式做到这一点。

【问题讨论】:

    标签: swift animation scenekit


    【解决方案1】:

    我相信这样的事情会为您指明正确的方向。

    首先我们将创建一个SCNNodeextension,以便我们可以在任何SCNNode 上使用我们的函数:

    //-----------------------
    //MARK: SCNNode Extension
    //-----------------------
    
    extension SCNNode{
    
        /// Creates A Pulsing Animation On An Infinite Loop
        ///
        /// - Parameter duration: TimeInterval
        func highlightNodeWithDurarion(_ duration: TimeInterval){
    
            //1. Create An SCNAction Which Emmits A Red Colour Over The Passed Duration Parameter
            let highlightAction = SCNAction.customAction(duration: duration) { (node, elapsedTime) in
    
                let color = UIColor(red: elapsedTime/CGFloat(duration), green: 0, blue: 0, alpha: 1)
                let currentMaterial = self.geometry?.firstMaterial
                currentMaterial?.emission.contents = color
    
            }
    
            //2. Create An SCNAction Which Removes The Red Emissio Colour Over The Passed Duration Parameter
            let unHighlightAction = SCNAction.customAction(duration: duration) { (node, elapsedTime) in
                let color = UIColor(red: CGFloat(1) - elapsedTime/CGFloat(duration), green: 0, blue: 0, alpha: 1)
                let currentMaterial = self.geometry?.firstMaterial
                currentMaterial?.emission.contents = color
    
            }
    
            //3. Create An SCNAction Sequence Which Runs The Actions
            let pulseSequence = SCNAction.sequence([highlightAction, unHighlightAction])
    
            //4. Set The Loop As Infinitie
            let infiniteLoop = SCNAction.repeatForever(pulseSequence)
    
            //5. Run The Action
            self.runAction(infiniteLoop)
        }
    
    }
    

    假设我们然后创建一个带有SCNSphereGeometrySCNNode,如下所示:

    let blueNode = SCNNode()
    let blueGeometry = SCNSphere(radius: 0.2)
    blueGeometry.firstMaterial?.diffuse.contents = UIColor.blue
    blueNode.geometry = blueGeometry
    blueNode.position = SCNVector3(1.5, 0, -1.5)
    blueNode.name = "BlueNode"
    augmentedRealityView.scene.rootNode.addChildNode(redNode)
    

    然后我们可以像这样在这个(或任何SCNNode)上调用highlight function

    blueNode.highlightNodeWithDurarion(5)
    

    【讨论】:

    • 嘿,谢谢。你是对的,这为我指明了正确的方向。 SCNAction 太酷了!我对这段代码做了一些改动,但它就像一个魅力。我要做的就是使用简单的 Copy() 取消共享节点的材料。
    猜你喜欢
    • 2016-12-15
    • 2019-04-30
    • 1970-01-01
    • 2019-02-19
    • 2019-08-25
    • 2017-07-31
    • 2017-01-13
    • 2016-06-18
    • 2017-10-21
    相关资源
    最近更新 更多