ios - 重力场不起作用,物体在真空中漂浮

标签 ios swift game-physics scenekit

我正在尝试模拟一个平面上有 5 个球的世界中的重力。我遇到的第一个问题是,球穿过地板是因为它们具有动态的 body 。但如果我使用运动体,它们就不会受到力的影响。所以我必须使用动态主体,禁用重力并使用重力场。场景是从 COLLADA 文件加载的。这就是我的设置方式:

self.scene = SCNScene(named: "art.scnassets/Balls.dae")!

for i in 1...5 {
    let sphere = scene.rootNode.childNode(withName: "Sphere\(i)", recursively: true)!
    let shape = SCNPhysicsShape(geometry: sphere.geometry!, options: nil)
    let body = SCNPhysicsBody(type: .dynamic, shape: shape)
    body.mass = 0.2
    body.isAffectedByGravity = false
    body.categoryBitMask = BallCategory
    body.collisionBitMask = PlaneCategory | BallCategory | GravityFieldCategory
    sphere.physicsBody = body

    balls.append(sphere)
}

self.plane = self.scene.rootNode.childNode(withName: "Plane", recursively: true)
let shape = SCNPhysicsShape(geometry: self.plane.geometry!, options: nil)
let body = SCNPhysicsBody(type: .static, shape: shape)
body.categoryBitMask = PlaneCategory
body.collisionBitMask = BallCategory
self.plane.physicsBody = body

// Create a gravity field
let gravityField = SCNPhysicsField.linearGravity()
gravityField.categoryBitMask = GravityFieldCategory
gravityField.direction = SCNVector3Make(0.0, -1.0, 0.0)
gravityField.isActive = true
gravityField.strength = 3.0
let gravityNode = SCNNode()
gravityNode.physicsField = gravityField
self.scene.rootNode.addChildNode(gravityNode)

然后,当用户触摸屏幕时,一个随机球向上移动,它应该落下:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let index = Int(arc4random_uniform(5))
    let ball = self.ball(atIndex: index)

    let moveUp = SCNAction.move(by: SCNVector3Make(0.0, 2.0, 0.0), duration: 1.5)
    ball.runAction(moveUp)
}

但它并没有掉下来,只是停在那里,漂浮在真空中。重力场不起作用。发生的情况如下:https://youtu.be/egMe4lgPZY0

最佳答案

飞机的形状似乎不正确。我尝试通过仅传递 nil 作为形状参数来创建飞机的物理主体:

 
    self.plane = self.scene.rootNode.childNode(withName: "Plane", recursively: true) 
    <s> let shape = SCNPhysicsShape(geometry: self.plane.geometry!, options: nil) </s> 
    let body = SCNPhysicsBody(type: .static, <b>shape:</b> <b>nil</b>)
    body.categoryBitMask = PlaneCategory
    body.collisionBitMask = BallCategory
    self.plane.physicsBody = body
 

我删除了重力场并打开了球的 isAffectedbyGravity 属性。现在可以了。

关于ios - 重力场不起作用,物体在真空中漂浮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39687747/

相关文章:

ios - 调整 UITableView 以允许使用键盘

swift - 快速从 findObjectsInBackgroundWithBlock 获取数据

ios - 从 viewController 的子类代码中删除按钮?

Unity3D, "knocked away"类型的光源对象?

ios - 从 CGImageMetadata 转换为 nsdictionary

iOS视频文件在应用程序启动时自动播放

ios - Objective-C 中的开放时间 - 两次 NSDate 之间的时间

iOS-Swift : Serialize a NSManagedObject to JSON (with relationships)

python - 计算在 pygame 中击中 2d 平面上目标的 X 和 Y 速度

java - 有人可以解释如何实验重力值吗?