質問編集履歴
1
コードのエラーによる問題は解決しましたが、アプリが動作中に落ちるという問題が発生しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -14,9 +14,9 @@
|
|
14
14
|
|
15
15
|
下記コードにより、トラッキングが外れた際に動画の一時停止を実現しようと試みました。
|
16
16
|
|
17
|
-
しかし、Cannot convert value of type 'SKVideoNode?' to expected argument type 'SCNNode'というエラーにより実現できず。
|
18
|
-
|
19
|
-
|
17
|
+
しかし、画像をトラッキングした瞬間にアプリが落ちてしまいます。
|
18
|
+
|
19
|
+
原因がわかりません。
|
20
20
|
|
21
21
|
|
22
22
|
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
func session(_ session: ARSession, didUpdate frame: ARFrame) {
|
26
26
|
|
27
|
-
if !sceneView.isNode(video
|
27
|
+
if !sceneView.isNode(videoHolder!, insideFrustumOf: sceneView!.pointOfView!) {
|
28
28
|
|
29
29
|
videoPlayerNode?.pause()
|
30
30
|
|
@@ -54,7 +54,7 @@
|
|
54
54
|
|
55
55
|
|
56
56
|
|
57
|
-
class ViewController: UIViewController, ARSCNViewDelegate {
|
57
|
+
class ViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate {
|
58
58
|
|
59
59
|
@IBOutlet var sceneView: ARSCNView!
|
60
60
|
|
@@ -64,21 +64,23 @@
|
|
64
64
|
|
65
65
|
|
66
66
|
|
67
|
+
|
68
|
+
|
67
69
|
override func viewDidLoad() {
|
68
70
|
|
69
71
|
super.viewDidLoad()
|
70
72
|
|
71
73
|
|
72
74
|
|
73
|
-
sceneView.delegate = self
|
74
|
-
|
75
75
|
let scene = SCNScene()
|
76
76
|
|
77
77
|
sceneView.scene = scene
|
78
78
|
|
79
79
|
}
|
80
80
|
|
81
|
-
|
81
|
+
|
82
|
+
|
83
|
+
|
82
84
|
|
83
85
|
override func viewWillAppear(_ animated: Bool) {
|
84
86
|
|
@@ -86,21 +88,31 @@
|
|
86
88
|
|
87
89
|
|
88
90
|
|
89
|
-
let configuration = ARImageTrackingConfiguration()
|
91
|
+
let configuration = ARImageTrackingConfiguration()
|
92
|
+
|
93
|
+
|
90
94
|
|
91
95
|
configuration.trackingImages = referenceImages!
|
92
96
|
|
97
|
+
|
98
|
+
|
93
99
|
sceneView.session.run(configuration)
|
94
100
|
|
101
|
+
|
102
|
+
|
95
|
-
}
|
103
|
+
}
|
104
|
+
|
105
|
+
|
106
|
+
|
96
|
-
|
107
|
+
var videoHolder: SCNNode?
|
97
|
-
|
98
|
-
|
99
|
-
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
100
112
|
|
101
113
|
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
|
102
114
|
|
103
|
-
|
115
|
+
|
104
116
|
|
105
117
|
guard let imageAnchor = anchor as? ARImageAnchor else { return }
|
106
118
|
|
@@ -116,27 +128,33 @@
|
|
116
128
|
|
117
129
|
|
118
130
|
|
119
|
-
let videoHolder = SCNNode()
|
120
|
-
|
121
131
|
let videoHolderGeometry = SCNPlane(width: width, height: height)
|
122
132
|
|
133
|
+
|
134
|
+
|
123
|
-
videoHolder.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
|
135
|
+
videoHolder!.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
|
124
|
-
|
136
|
+
|
137
|
+
|
138
|
+
|
125
|
-
videoHolder.geometry = videoHolderGeometry
|
139
|
+
videoHolder!.geometry = videoHolderGeometry
|
126
140
|
|
127
141
|
|
128
142
|
|
129
143
|
if let videoURL = Bundle.main.url(forResource: "img.scnassets/route", withExtension: "MOV"){
|
130
144
|
|
131
|
-
setupVideoOnNode(videoHolder, fromURL: videoURL)
|
145
|
+
setupVideoOnNode(videoHolder!, fromURL: videoURL)
|
132
|
-
|
146
|
+
|
133
|
-
}
|
147
|
+
}
|
134
|
-
|
135
|
-
|
136
|
-
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
|
137
|
-
node.addChildNode(videoHolder)
|
153
|
+
node.addChildNode(videoHolder!)
|
138
|
-
|
154
|
+
|
155
|
+
|
156
|
+
|
139
|
-
videoHolder.name = "route"
|
157
|
+
videoHolder!.name = "route"
|
140
158
|
|
141
159
|
}
|
142
160
|
|
@@ -166,6 +184,8 @@
|
|
166
184
|
|
167
185
|
|
168
186
|
|
187
|
+
|
188
|
+
|
169
189
|
let spriteKitScene = SKScene(size: CGSize(width: 1000, height: 1000))
|
170
190
|
|
171
191
|
spriteKitScene.scaleMode = .aspectFit
|
@@ -178,10 +198,14 @@
|
|
178
198
|
|
179
199
|
|
180
200
|
|
201
|
+
|
202
|
+
|
181
203
|
node.geometry?.firstMaterial?.diffuse.contents = spriteKitScene
|
182
204
|
|
183
205
|
|
184
206
|
|
207
|
+
|
208
|
+
|
185
209
|
videoPlayerNode?.play()
|
186
210
|
|
187
211
|
videoPlayer.volume = 100
|
@@ -216,13 +240,13 @@
|
|
216
240
|
|
217
241
|
}
|
218
242
|
|
219
|
-
|
243
|
+
|
220
244
|
|
221
245
|
|
222
246
|
|
223
247
|
func session(_ session: ARSession, didUpdate frame: ARFrame) {
|
224
248
|
|
225
|
-
if !sceneView.isNode(video
|
249
|
+
if !sceneView.isNode(videoHolder!, insideFrustumOf: sceneView!.pointOfView!) {
|
226
250
|
|
227
251
|
videoPlayerNode?.pause()
|
228
252
|
|
@@ -232,7 +256,7 @@
|
|
232
256
|
|
233
257
|
|
234
258
|
|
235
|
-
|
259
|
+
// 画面に表示された直後に呼ばれる。
|
236
260
|
|
237
261
|
override func viewWillDisappear(_ animated: Bool) {
|
238
262
|
|
@@ -246,6 +270,8 @@
|
|
246
270
|
|
247
271
|
|
248
272
|
|
273
|
+
|
274
|
+
|
249
275
|
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
250
276
|
|
251
277
|
guard let location = touches.first?.location(in: sceneView),
|