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。