SceneKit如何在不同高度的地形上移动角色

时间:2019-06-29 18:48:18

标签: ios swift scenekit

我正在一个有角色的场景和带楼梯的平台上工作。角色必须在楼梯上上下移动并从平台跳下: enter image description here

我通过虚拟键盘移动角色。我正在寻找移动角色的正确方法。现在我有两种方法,每种都有其优点和缺点:

第一种方法:射线测试。这种方法很完美:我可以在楼梯上上下移动角色,但是如果我在垫子附近有很多物体,并且想跳下去,我需要做很多射线测试。

第二种方式:移动角色的物理身体。通过这种方式,我无法理解如何将角色下移楼梯。每次看起来都像是跳上楼梯。

那么在不同高度的地形上移动角色的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

要在不同高度的地形上移动角色,应使用collisions。要了解更多信息,请在WWDC 2015(时间17:30 )上观看Enhancements to SceneKit,并查看Fox 2游戏示例中的代码。

以下是使用冲突的代码段:

private func loadCharacter() {
    let scene = SCNScene( named: "Art.scnassets/character/max.scn")!
    model = scene.rootNode.childNode( withName: "Max_rootNode", recursively: true)
    model.simdPosition = Character.modelOffset

    characterNode = SCNNode()
    characterNode.name = "character"
    characterNode.simdPosition = Character.initialPosition

    characterOrientation = SCNNode()
    characterNode.addChildNode(characterOrientation)
    characterOrientation.addChildNode(model)

    let collider = model.childNode(withName: "collider", recursively: true)!
    collider.physicsBody?.collisionBitMask = Int(([ .enemy, .trigger, .collectable ] as Bitmask).rawValue)

    let (min, max) = model.boundingBox
    let collisionCapsuleRadius = CGFloat(max.x - min.x) * CGFloat(0.4)
    let collisionCapsuleHeight = CGFloat(max.y - min.y)

    let collisionGeometry = SCNCapsule(capRadius: collisionCapsuleRadius, height: collisionCapsuleHeight)
    characterCollisionShape = SCNPhysicsShape(geometry: collisionGeometry, options:[.collisionMargin: Character.collisionMargin])
    collisionShapeOffsetFromModel = float3(0, Float(collisionCapsuleHeight) * 0.51, 0.0)
}