Cocoa touch 如何在SCNNode上设置自定义属性的动画?

Cocoa touch 如何在SCNNode上设置自定义属性的动画?,cocoa-touch,swift,scenekit,Cocoa Touch,Swift,Scenekit,我有一个在初始化过程中创建几何体的对象 class Helix { var width: GLfloat // x var height: GLfloat // y var depth: GLfloat // z var radius: GLfloat var pitchInherent: GLfloat var pitchCurrent: GLfloat /* Other SceneKit related pr

我有一个在初始化过程中创建几何体的对象

class Helix {
    var width: GLfloat      // x
    var height: GLfloat     // y
    var depth: GLfloat      // z
    var radius: GLfloat
    var pitchInherent: GLfloat
    var pitchCurrent: GLfloat
    /* Other SceneKit related properties used later */
    init(width: Float, height: Float, depth: Float) {
        /* Geometry logic */
        geometry = SCNGeometry(sources: [vertexSource], elements: [element])
    }
    func getNode() -> SCNNode {
        return SCNNode(geometry: geometry)
    }
}
然后在视图控制器中,我将其添加到节点树中

let scene = SCNScene()
let helix = Helix(width: 30, height: 30, depth: 30)
let helixNode = helix.getNode()
scene.rootNode.addChildNode(helixNode)

我想设置
pitchCurrent
属性的动画。在自定义
CALayer
对象时的
Objective-C
世界中,我曾将我想要设置动画的那些属性指定为
动态
,并为相应的
键指定了一个侦听器。在这种情况下我应该怎么做?

每帧重建一个顶点数组并没有那么糟糕。然而,每帧重新上传到GPU,可能不会带来让你一天都充满活力的性能

相反,我建议在GPU的顶点阶段使用自定义几何体。(一定要点击该页面顶部的“更多”链接进行详细讨论。)您甚至可以将其与自定义的
Helix
类相结合,从实现
SCNShadable
的Swift nice和easy-SceneKit对象更改宽度/半径/间距/等参数,自动使用KVO将GLSL制服视为类属性

要做到这一点,您首先需要重构,以便
Helix
子类
SCNGeometry
SCNNode
,然后像
CALayer
案例一样,将您的属性声明为
dynamic

然后,创建执行几何体自定义的GLSL代码段:

// declare uniforms whose names match your class' dynamic properties
uniform float width;
uniform float height;
// etc

// do your geometry math 
_geometry.position = /* Geometry logic */
最后,使用
scnshaderModifierTypeGeometry
入口点,将此代码段分配给节点的
shaderModifier

let shader = "all that GLSL stuff above" // or better, load it from a file
geometry.shaderModifiers = [ SCNShaderModifierEntryPointGeometry: shader ]

此时,您应该能够创建自定义螺旋节点/几何体的实例,并使用SceneKit的任何动画技巧为其
宽度
高度
,设置动画,etc属性。

我担心的是,我可能必须为每一帧重做整个顶点数组……这无疑为我需要解决的问题开辟了一个全新的领域。我需要一段时间才能做到这一点,所以暂时来说,谢谢!如果需要,我会提供更多详细信息:)请注意,您的自定义属性不一定是动态的。只是
SCNNode
scngometry
是符合键值编码的容器类(就像
CALayer
),允许您对任意键使用KVC。