首页 文章

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

提问于
浏览
2

在 SceneKit 中,可以使SCNPhysicsBody不受SCNPhysicsField的影响,给它们categoryBitMask s,当使用按位 AND 进行比较时,得到的值为零。与字段相比,类别位掩码产生非零值的实体仍然受其影响。

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


澄清:

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

因为它代表粒子系统和物理体都会受到两个场的影响。除非我给他们 categoryBitMasks 告诉他们要与哪些字段进行交互。除了粒子系统没有 categoryBitMasks,并且如果物理场的 categoryBitMask 不是默认值,它将被任何粒子忽略。

所以我可以设置它,使其中一个字段只通过赋予它们相同的类别来影响身体。但我不能对粒子做同样的事情。有没有办法实现这个目标? (使用世界引力作为其中一个字段不起作用,因为它没有 categoryBitMask either.)

我实际上只是使用粒子系统的加速属性而不是物理场来找出一个解决方法(现在)。但我很想知道是否可以使用物理领域来实现它。


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

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)

1 回答

  • 2

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

    要确定字段是否影响由 SCNParticleSystem 对象生成的粒子,SceneKit 将使用包含粒子系统的节点的 categoryBitMask 属性执行相同的检查。

相关问题