質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

Swift Playgrounds

Swift Playgroundsは、初心者・子ども向けのSwift学習アプリ。iPad/Mac用があり、コーディングの知識は不要です。Swiftの言語そのものを選択肢からタップしてコード入力できる点が特徴。段階的に学習を積み上げる初心者にも優しい設計ながらも、正統派のSwiftが学べます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

734閲覧

scenekitとswiftuiでBoxとFloorの衝突時にprintできるようにしたいです。

marriageblue

総合スコア3

Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

Swift Playgrounds

Swift Playgroundsは、初心者・子ども向けのSwift学習アプリ。iPad/Mac用があり、コーディングの知識は不要です。Swiftの言語そのものを選択肢からタップしてコード入力できる点が特徴。段階的に学習を積み上げる初心者にも優しい設計ながらも、正統派のSwiftが学べます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/02/21 15:11

boxNodeがfloorNodeと衝突した時にprint出来るようにしたいです。ビットマスクの使い方等を調査し、下記のように書いてみましたが、表示がされないです。下記の書き方だとなぜ表示されないのでしょうか?また、どのように修正することで表示されるのかをご教授いただきたいです。よろしくお願いします。

swift

1 2import SwiftUI 3import SceneKit 4 5struct ContentView: View { 6 var body: some View { 7 gameview() 8 } 9} 10 11struct gameview:UIViewRepresentable{ 12 var scene = SCNScene() 13 var scnView = SCNView() 14 var boxNode = SCNNode() 15 var floorNode = SCNNode() 16 typealias UIViewType = SCNView 17 18 func makeUIView(context: Context) -> SCNView{ 19 scnView.scene = scene 20 FloorNode() 21 BoxNode() 22 Omnilight() 23 ambientlight() 24 Camera() 25 return scnView 26 } 27 func updateUIView(_ uiView: SCNView, context: Context){ 28 29 } 30 func Omnilight(){ 31 let light = SCNNode() 32 light.light = SCNLight() 33 light.light?.type = .omni 34 light.position = SCNVector3(0,10,35) 35 scene.rootNode.addChildNode(light) 36 } 37 func ambientlight(){ 38 let ambientLightNode = SCNNode() 39 ambientLightNode.light = SCNLight() 40 ambientLightNode.light?.type = .ambient 41 ambientLightNode.light?.color = UIColor.gray 42 scene.rootNode.addChildNode(ambientLightNode) 43 } 44 func Camera(){ 45 let camera = SCNNode() 46 camera.camera = SCNCamera() 47 camera.position = SCNVector3(0,20,55) 48 scene.rootNode.addChildNode(camera) 49 } 50 func FloorNode(){ 51 let floor = SCNFloor() 52 floorNode.geometry = floor 53 floor.firstMaterial?.diffuse.contents = UIColor.gray 54 floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: .init(geometry: floor)) 55 floorNode.physicsBody?.collisionBitMask = 1 56 floorNode.physicsBody?.categoryBitMask = 1 57 floorNode.physicsBody?.contactTestBitMask = 1 58 scene.rootNode.addChildNode(floorNode) 59 } 60 func BoxNode(){ 61 let box = SCNBox(width: 10, height: 5, length: 10, chamferRadius: 1) 62 box.firstMaterial?.diffuse.contents = UIColor.brown 63 let boxNode = SCNNode(geometry: box) 64 boxNode.position = SCNVector3(x: 0, y: 30, z: 0) 65 boxNode.rotation = SCNVector4(x: 1, y: 1, z: 1, w: 0.25) 66 boxNode.name = "box" 67 boxNode.physicsBody = .init(type: .dynamic, shape: .init(geometry: box)) 68 boxNode.physicsBody?.collisionBitMask = 1 69 boxNode.physicsBody?.categoryBitMask = 1 70 boxNode.physicsBody?.contactTestBitMask = 1 71 scene.rootNode.addChildNode(boxNode) 72 } 73 func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) { 74 let firstNode = contact.nodeA 75 let secondNode = contact.nodeB 76 77 print(firstNode.name! + " hit to " + secondNode.name!) 78 } 79 80} 81extension SCNPhysicsContactDelegate { 82 83 func physicsWorld(_ world: SCNPhysicsWorld, didBegin: SCNPhysicsContact) { 84 print("Begin!!!") 85 } 86 87 func physicsWorld(_ world: SCNPhysicsWorld, didUpdate: SCNPhysicsContact) { 88 print("Update!!!") 89 } 90 91 func physicsWorld(_ world: SCNPhysicsWorld, didEnd: SCNPhysicsContact) { 92 print("End!!!") 93 } 94} 95

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SceneKitというものがあるのですね。
3Dの箱がちょっと傾きながら落ちていって、すごいですね。

接触メッセージを受信するには、SCNPhysicsWorld オブジェクトの contactDelegate プロパティを設定します。SceneKit は、接触が始まるとき、接触に関する情報が変更されるとき、そして接触が終了するときに、デリゲートメソッドを呼び出します。
https://developer.apple.com/documentation/scenekit/scnphysicscontactdelegate/

「SCNPhysicsWorld オブジェクトの contactDelegate プロパティを設定します。」
ということのようですので、contactDelegate プロパティを設定するように変更してみました。

swift

1import SwiftUI 2import SceneKit 3 4struct ContentView: View { 5 var body: some View { 6 gameview() 7 } 8} 9 10struct gameview:UIViewRepresentable{ 11 // SCNPhysicsContactDelegateを実装したクラスのインスタンスです 12 var contact = SCNPhysicsContactClass() 13 var scene = SCNScene() 14 var scnView = SCNView() 15 var boxNode = SCNNode() 16 var floorNode = SCNNode() 17 typealias UIViewType = SCNView 18 19 func makeUIView(context: Context) -> SCNView{ 20 // SCNPhysicsWorld オブジェクトの contactDelegate プロパティを設定します 21 scene.physicsWorld.contactDelegate = contact 22 scnView.scene = scene 23 FloorNode() 24 BoxNode() 25 Omnilight() 26 ambientlight() 27 Camera() 28 return scnView 29 } 30 func updateUIView(_ uiView: SCNView, context: Context){ 31 32 } 33 func Omnilight(){ 34 let light = SCNNode() 35 light.light = SCNLight() 36 light.light?.type = .omni 37 light.position = SCNVector3(0,10,35) 38 scene.rootNode.addChildNode(light) 39 } 40 func ambientlight(){ 41 let ambientLightNode = SCNNode() 42 ambientLightNode.light = SCNLight() 43 ambientLightNode.light?.type = .ambient 44 ambientLightNode.light?.color = UIColor.gray 45 scene.rootNode.addChildNode(ambientLightNode) 46 } 47 func Camera(){ 48 let camera = SCNNode() 49 camera.camera = SCNCamera() 50 camera.position = SCNVector3(0,20,55) 51 scene.rootNode.addChildNode(camera) 52 } 53 func FloorNode(){ 54 let floor = SCNFloor() 55 floorNode.geometry = floor 56 floor.firstMaterial?.diffuse.contents = UIColor.gray 57 floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: .init(geometry: floor)) 58 floorNode.physicsBody?.collisionBitMask = 1 59 floorNode.physicsBody?.categoryBitMask = 1 60 floorNode.physicsBody?.contactTestBitMask = 1 61 scene.rootNode.addChildNode(floorNode) 62 } 63 func BoxNode(){ 64 let box = SCNBox(width: 10, height: 5, length: 10, chamferRadius: 1) 65 box.firstMaterial?.diffuse.contents = UIColor.brown 66 let boxNode = SCNNode(geometry: box) 67 boxNode.position = SCNVector3(x: 0, y: 30, z: 0) 68 boxNode.rotation = SCNVector4(x: 1, y: 1, z: 1, w: 0.25) 69 boxNode.name = "box" 70 boxNode.physicsBody = .init(type: .dynamic, shape: .init(geometry: box)) 71 boxNode.physicsBody?.collisionBitMask = 1 72 boxNode.physicsBody?.categoryBitMask = 1 73 boxNode.physicsBody?.contactTestBitMask = 1 74 scene.rootNode.addChildNode(boxNode) 75 } 76 func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) { 77 let firstNode = contact.nodeA 78 let secondNode = contact.nodeB 79 80 print(firstNode.name! + " hit to " + secondNode.name!) 81 } 82 83} 84 85// 「Protocol Extensions」でプロトコル自体で動作を定義するのではなく、 86// structのViewから使えるようにクラスとして実装します 87class SCNPhysicsContactClass: NSObject, SCNPhysicsContactDelegate { 88 89 func physicsWorld(_ world: SCNPhysicsWorld, didBegin: SCNPhysicsContact) { 90 print("Begin!!!") 91 } 92 93 func physicsWorld(_ world: SCNPhysicsWorld, didUpdate: SCNPhysicsContact) { 94 print("Update!!!") 95 } 96 97 func physicsWorld(_ world: SCNPhysicsWorld, didEnd: SCNPhysicsContact) { 98 print("End!!!") 99 } 100}

投稿2022/02/22 00:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marriageblue

2022/02/22 11:20

無事解決しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問