swift - 使粒子系统仅受 SceneKit 中某些类别的物理场的影响?

标签 swift ios8 scenekit

在 SceneKit 中,可以通过使用按位 AND 进行比较时提供 categoryBitMask 来使 SCNPhysicsBody 不受 SCNPhysicsField 的影响,结果为零。 与字段的值相比,类别位掩码产生非零值的主体仍受其影响。

是否可以对 SCNParticleSystem 中的粒子执行相同的操作,以便粒子不受 SCNPhysicsField 的影响(编辑:并且仍然会影响粒子)受到其他物理场的影响),但某些物理体甚至其他粒子系统会受到它的影响吗?


澄清:

我想要的是:一个受SCNPhysicsField(特别是线性重力场)影响的SCNParticleSystem。这可以通过将粒子系统的 affectedByPhysicsFields 属性设置为 true 来完成。然而,这将使粒子系统受到场景中所有物理场的影响。我有另一个场(也是线性重力场),我只想影响 SCNPhysicsBody,我不希望它受到粒子系统场的影响。

就目前情况而言,粒子系统和物理体都会受到这两个场的影响。除非我给他们categoryBitMasks来告诉他们要与哪些字段进行交互。除了粒子系统没有categoryBitMasks之外,如果物理场的categoryBitMask不是默认值,任何粒子都会忽略它。

所以我可以设置它,以便其中一个字段仅通过给它们相同的类别来影响正文。但我不能对粒子做同样的事情。有什么办法可以做到这一点吗? (使用世界重力作为字段之一不起作用,因为它也没有categoryBitMask。)

我实际上已经找到了一种解决方法(目前),只需使用粒子系统的加速属性而不是物理场。但我很好奇是否真的可以使用物理场来做到这一点。


编辑:根据要求,这里是一些示例代码。此代码会产生一个受两个物理场影响的球体,以及一个受一个物理场影响的粒子系统。评论解释了问题。

let PhysicsCategorySphere = 1 << 0
let PhysicsCategoryParticles = 1 << 1

scene.physicsWorld.gravity = SCNVector3(x: 0, y: 0, z: 0)

let sphere = SCNNode(geometry: SCNSphere(radius: 1))
sphere.physicsBody = SCNPhysicsBody.dynamicBody()
sphere.physicsBody?.categoryBitMask = PhysicsCategorySphere
//only physics fields with categoryBitMasks that match the sphere's can affect it
scene.rootNode.addChildNode(sphere)

let field = SCNPhysicsField.linearGravityField()
field.strength = 9.8
field.direction = SCNVector3(x: 0, y: 1, z: 0)
field.categoryBitMask = PhysicsCategorySphere
//only things with categories that match the field's will be affected by it
let fieldNode = SCNNode()
fieldNode.physicsField = field
scene.rootNode.addChildNode(fieldNode)

let particleSystem = SCNParticleSystem(named: "particles", inDirectory: "")
particleSystem.affectedByPhysicsFields = true
//there is no way that I know of to give the particle system a physics category
let particleNode = SCNNode()
particleNode.addParticleSystem(particleSystem)
scene.rootNode.addChildNode(particleNode)

let particleField = SCNPhysicsField.linearGravityField()
particleField.strength = 20
particleField.direction = SCNVector3(x: 0, y: 0, z: 1)
//particleField.categoryBitMask = PhysicsCategoryParticles
//if the field is given a category, it will no longer affect the particles
//the default is to match all categories, thus the particle field will also affect the sphere
let particleFieldNode = SCNNode()
particleFieldNode.physicsField = particleField
scene.rootNode.addChildNode(particleFieldNode)

最佳答案

好吧,我不知道我是如何忽略这一点的,但答案就在 SCNPhysicsFieldcategoryBitMask 属性的文档中。

To determine whether a field affects the particles spawned by an SCNParticleSystem object, SceneKit performs the same check using the categoryBitMask property of the node containing the particle system.

关于swift - 使粒子系统仅受 SceneKit 中某些类别的物理场的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27923791/

相关文章:

ios - 自定义 TableViewCell Swift

javascript - 触摸事件不会在输入时触发 iOS8 独立网络应用程序

swift - 如何将 View Controller 推送到生成的导航层次结构中

ios - 从 Parse 检索应用程序中已有的联系人时遇到问题

ios - 如果设备支持 Touch ID

iphone - ARKit是否考虑iPhone和iPad中的镜头变形?

objective-c - SceneKit – 映射物理 360 度旋转

swift - 在 ARKit 中查找用户面向的方向

ios - 使用 AVMutableComposition 拼接(合并)视频时固定方向

ios - 'performFetchWithCompletionHandler' 是在没有网络连接的情况下调用的吗?