

ARkit + SceneKitで物理シミュレーションをしています．

### 目的

壁と壁の間にボールを放ち，等速直線運動させながら反射を無限に繰り返えす挙動を実現したい．

ボールに力を与え，壁とボールのrestituitionを1.0に指定しましたが，反射の度に減速してしまいます．  
また大きい数字（２.1以上）にすると発散して加速し続けてしまいます．  
等速直線運動しながら反射させるにはどうしたらいいでしょうか？

[code]

    // ボールを発射する関数
    func shootBall(scene: SCNScene) {
        let ballGeo = SCNSphere(radius: 0.05)
        
        // physics setting
        let physicsShape = SCNPhysicsShape(geometry: ballGeo, options: nil)
        let ballBody = SCNPhysicsBody(type: .dynamic, shape: physicsShape)
    
        // 反射率を設定
        ballBody.restitution = 1.0
    
        // 色
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.purple
    　　　
    　　 // ノード設定
        let ballNode = SCNNode(geometry: ballGeo)
        ballNode.physicsBody = SCNPhysicsBody.dynamic()
        ballNode.physicsBody?.isAffectedByGravity = true
        ballNode.geometry?.materials = [material]
        ballNode.position = SCNVector3(0, 0, 0)
        
        scene.rootNode.addChildNode(ballNode)
        // 力を加えてボールを発射
        ballNode.physicsBody?.applyForce(SCNVector3(0,0,-4), asImpulse: true)
    
    }
    // 壁を作る関数
    func generateWallNode (position: SCNVector3, height: CGFloat, width: CGFloat, color: UIColor) -> SCNNode {
        let wall = SCNBox(width: width, height: height, length: 0.1, chamferRadius: 0)
    
        // 物理情報をセット
        let wallShape = SCNPhysicsShape(geometry: wall, options: nil)
        let wallBody = SCNPhysicsBody(type: .static, shape: wallShape)
        wallBody.restitution = 1.0
    
        // ノードを作成
        let wallNode = SCNNode(geometry: wall)
        wallNode.physicsBody = wallBody
        wallNode.position = position
        
        return wallNode
    }
    
[/code]


CC BY-SA 4.0
2020-10-25T05:25:55.920
71495
2020-10-28T23:25:49.037
2020-10-28T23:25:49.037
2238
42465
question
swift ios
SceneKitでrestitutionを1にしても減速して反射する


SceneKitはあまり扱ったことがないので、SpriteKitからの推測・参考情報ですが、`damping`と`friction`も衝突時の挙動に影響を与えるので試してみてはいかがでしょうか。

[code]

            ballBody.damping = 0
            ballBody.friction = 0
    
[/code]

(上記コード例は`ballBody`だけのものですが、他の全ての`SCNPhysicsBody`にも設定しておく必要があります。)


CC BY-SA 4.0
2020-10-25T06:48:02.933
71498
2020-10-25T06:48:02.933
13972
71495
answer


自己解決しました．  
理由は単純なミスで，

[code]

    wallNode.physicsBody = wallBody
    
[/code]

をしてノードに物理情報をセットしていないこと原因でした．


CC BY-SA 4.0
2020-10-26T07:05:50.640
71517
2020-10-26T08:05:44.873
2020-10-26T08:05:44.873
32986
42465
71495
answer