【问题标题】:Make particle system only be affected by certain categories of physics fields in SceneKit?让粒子系统只受SceneKit中某些类别的物理场的影响?
【发布时间】:2015-03-11 12:09:02
【问题描述】:

在 SceneKit 中,可以使 SCNPhysicsBody 不受 SCNPhysicsField 的影响,方法是给它们 categoryBitMasks,当使用按位与进行比较时,结果为零。 与字段相比,类别位掩码产生非零值的主体仍受其影响。

是否可以对SCNParticleSystem 中的粒子做同样的事情,这样粒子就不会受到SCNPhysicsField 的影响(编辑:粒子仍然会受到其他物理场的影响),但是某些物理体甚至其他粒子系统受到影响?


澄清一下:

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

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

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

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


编辑:这里要求的是一些示例代码。此代码导致一个球体受两个物理场影响,一个粒子系统受一个物理场影响。 cmets 解释了这个问题。

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)

【问题讨论】:

  • 是什么阻止你尝试一下?
  • 从尝试什么开始?
  • 你所描述的,具有物理场的粒子。只需在测试项目中快速设置,即粒子系统 + 物理体和两个字段
  • 我确实尝试过 - 但无法让它工作。这就是我来这里的原因。请参阅我对问题的编辑。
  • 你能发布你使用的实际代码吗?

标签: swift ios8 scenekit


【解决方案1】:

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

确定场是否影响由 SCNParticleSystem 对象,SceneKit 使用 包含粒子系统的节点的 categoryBitMask 属性。

【讨论】:

  • 这有什么帮助?它读起来就像 SCNParticleSystem 的节点正在检查 SCNParticleSystem (自身)以查看它是否具有相同的 categoryBitMask ...我认为不可能没有。
  • SCNParticleSystemSCNNode 正在对照SCNPhysicsFieldcategoryBitMask 检查它的categoryBitMask 属性。
猜你喜欢
  • 2015-10-14
  • 2015-10-13
  • 2019-05-28
  • 2023-03-30
  • 2019-02-12
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多