2017-10-17 76 views
1

我在ARKit上遇到問題,我需要幫助。 我正在做一個小演示,我在場景中放置一個簡單的SCNTorus幾何體,並且試圖將一個小球(SCNSphere)扔進圓環孔。問題在於球在中間彈跳而不是通過。 沒有爲環面的代碼:ARKit:球沒有穿過SCNTorus洞

 let ring = SCNTorus(ringRadius: 0.4, pipeRadius: 0.1) 
    ring.ringSegmentCount = 100 

    let ringMaterial = SCNMaterial() 
    ringMaterial.diffuse.contents = UIImage(named: "art.scnassets/Ball/BeachBallColor.jpg") 

    ring.materials = [ringMaterial] 

    let ringNode = SCNNode() 
    ringNode.position = SCNVector3(
     x: location.worldTransform.columns.3.x, 
     y:location.worldTransform.columns.3.y + 0.8, 
     z: location.worldTransform.columns.3.z 
    ) 

    ringNode.geometry = ring 

    let body = SCNPhysicsBody(type: SCNPhysicsBodyType.kinematic, 
           shape: nil) 
    body.categoryBitMask = CollisionTypes.wall.rawValue 
    body.collisionBitMask = CollisionTypes.beachball.rawValue 
    // body.contactTestBitMask = CollisionTypes.beachball.rawValue 
    body.isAffectedByGravity = false 
    body.mass = 0.5 

    ringNode.physicsBody = body 

    sceneView.scene.rootNode.addChildNode(ringNode) 

而對於球:

let node = SCNNode(geometry: sphere!) 
    node.renderingOrder = 10 

    let body = SCNPhysicsBody(type: SCNPhysicsBodyType.dynamic,shape: nil) 
    body.categoryBitMask = CollisionTypes.beachball.rawValue 
    body.collisionBitMask = CollisionTypes.solid.rawValue|CollisionTypes.wall.rawValue|CollisionTypes.beachball.rawValue 
    // body.contactTestBitMask = CollisionTypes.fireball.rawValue|CollisionTypes.wall.rawValue 
    body.isAffectedByGravity = true 
    body.mass = 0.5 
    body.restitution = 0.75 
    body.damping = 0.1 
    body.friction = 0.8 

    node.physicsBody = body 
+0

可能的重複:https://stackoverflow.com/q/27391763/957768 – rickster

回答

1

使用創建physicsbody(體型kinametic和形狀無)以簡化的「凸結果的代碼船體「幾何形狀的表示。簡而言之,您看到的幾何體是圓環面,但用於碰撞檢測的幾何體不是。

的(OBJ C)這行代碼實際上是從蘋果的示例代碼項目之一:

_torus.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeStatic shape:[SCNPhysicsShape shapeWithGeometry:_torus.geometry options: @{SCNPhysicsShapeTypeKey : SCNPhysicsShapeTypeConcavePolyhedron} ] ]; 

換句話說,你需要根據幾何自己創建一個靜態類型的身體和形狀使用SCNPhysicsShapeTypeConcavePolyhedron鍵值(僅適用於靜態物體)最終以環體幾何形狀的更精確表示作爲物理體。

有關詳細信息,請參閱:https://developer.apple.com/documentation/scenekit/scnphysicsshape

0

謝謝!這行得通! 有代碼:

let ring = SCNTorus(ringRadius: 0.4, pipeRadius: 0.1) 
    ringNode.geometry = ring 

    let shapeOptions = [ SCNPhysicsShape.Option.type : SCNPhysicsShape.ShapeType.concavePolyhedron] 
    let physicShape = SCNPhysicsShape(geometry: ring, options: shapeOptions) 

    let body = SCNPhysicsBody(type: SCNPhysicsBodyType.kinematic, 
           shape: physicShape) 
    body.categoryBitMask = CollisionTypes.wall.rawValue 
    body.collisionBitMask = CollisionTypes.beachball.rawValue 
    body.isAffectedByGravity = false 
    body.mass = 0.5 
    ringNode.physicsBody = body