Ios 如何在SceneKit中以编程方式以特定角度旋转粒子?

Ios 如何在SceneKit中以编程方式以特定角度旋转粒子?,ios,scenekit,particles,Ios,Scenekit,Particles,我想旋转一个粒子,它是一条简单的线,在屏幕中心发射一次 当我触摸屏幕后,方法被调用,旋转一直在变化。围绕x或z轴旋转10°或180°,结果是相同的:角度是N°,然后是Y°,然后是z°(始终是一个不同的数字,彼此之间存在随机差异:10°时,每次的偏移量不是10,而是一个随机数)。你知道为什么吗 func addParticleSceneKit(str:String){ var fire = SCNParticleSystem(named: str, inDirectory: "art.sc

我想旋转一个粒子,它是一条简单的线,在屏幕中心发射一次

当我触摸屏幕后,方法被调用,旋转一直在变化。围绕
x
z
轴旋转10°或180°,结果是相同的:角度是N°,然后是Y°,然后是z°(始终是一个不同的数字,彼此之间存在随机差异:10°时,每次的偏移量不是10,而是一个随机数)。你知道为什么吗

func addParticleSceneKit(str:String){
    var fire = SCNParticleSystem(named: str, inDirectory: "art.scnassets/Particles")
    fire.orientationMode = .Free
    fire.particleAngle = 90
    //fire.propertyControllers = [ SCNParticlePropertyRotationAxis : [1,0,0] ] // should it be a SCNParticlePropertyController? I don't know how to use it then. But it would not be for an animation in my case.
    emitter.addParticleSystem(fire)
感谢

该属性控制初始粒子角度的随机变化。通常默认为零,这意味着粒子角度不是随机化的,但您正在从文件加载粒子系统,因此您将获得该文件中的任何内容-将其设置为零将停止您看到的随机化。(也可以通过在Xcode中编辑要从中加载的文件中的粒子系统来执行此操作。)


顺便说一下,您不是每次要发射单个粒子时都要向场景添加另一个新粒子系统,是吗?迟早会有问题的。相反,保留单个粒子系统,并使单击时发射更多粒子

假设您已经在Xcode粒子系统编辑器中设置了其属性和属性,以便在将其添加到场景时发射单个粒子?然后只要调用它的方法,它就会重新开始,而无需向场景中添加另一个


另外,关于你的评论

它应该是SCNParticlePropertyController吗?那我就不知道怎么用了。但在我的例子中,这不是动画

阅读可能会有所帮助。但要点如下:
propertycontroller
应该是
[String:SCNParticlePropertyController]
的字典。我知道,它说的是
[NSObject:AnyObject]
,但这是因为这个API是从ObjC导入的,ObjC没有类型化的集合。这就是为什么文档很重要的原因——它说“本词典中的每个关键点都是粒子属性关键点中列出的常数之一,每个关键点的值都是一个SCNParticlePropertyController对象…”这是一个冗长的英语,用于同样的事情

因此,传递一个字典,其中键是一个字符串,值是一个整数数组,这对您没有帮助

还表示属性控制器用于设置属性动画,并且您可以从核心动画创建一个属性控制器。因此,如果希望每个粒子随时间旋转,则应使用“角度”属性控制器:

let angleAnimation = CABasicAnimation()
angleAnimation.fromValue = 0 // degrees
angleAnimation.toValue = 90 // degrees
angleAnimation.duration = 1 // sec
let angleController = SCNParticlePropertyController(animation: angleAnimation)
fire.propertyControllers = [ SCNParticlePropertyAngle: angleController ]
或者对于旋转轴,如果您希望粒子(由于方向模式和角速度已经自由旋转)从一个旋转轴平滑过渡到另一个旋转轴:

let axisAnimation = CABasicAnimation()
axisAnimation.fromValue = NSValue(SCNVector3: SCNVector3(x: 0, y: 0, z: 1))
axisAnimation.toValue =NSValue(SCNVector3: SCNVector3(x: 0, y: 1, z: 0))
axisAnimation.duration = 1 // sec
let axisController = SCNParticlePropertyController(animation: axisAnimation)
fire.propertyControllers = [ SCNParticlePropertyRotationAxis: axisController ]

谢谢我试图将变量设置为0,但没有成功。当我尝试添加从0到90的动画时,结果是一样的:旋转始终在变化,每次都是随机旋转。我使用带有黑色背景的白线作为图像,简单的alpa值从0到1,再到0。你试过了吗?也许我犯了个错误,但我不知道在哪里。
let axisAnimation = CABasicAnimation()
axisAnimation.fromValue = NSValue(SCNVector3: SCNVector3(x: 0, y: 0, z: 1))
axisAnimation.toValue =NSValue(SCNVector3: SCNVector3(x: 0, y: 1, z: 0))
axisAnimation.duration = 1 // sec
let axisController = SCNParticlePropertyController(animation: axisAnimation)
fire.propertyControllers = [ SCNParticlePropertyRotationAxis: axisController ]