Я разрабатываю приложение для iOS с ARKit, которое обнаруживает N изображений (только одно сразу) и, когда оно обнаруживает одно изображение, показывает 3D-модель, воспроизводит звук и отображает 2D-эффект на экране (например, дождь в экран).
Мне удалось обнаружить изображения и показать 3D-модель, но когда я добавляю звук, он воспроизводится только в первый раз, и как только я перемещаю телефон на необнаруженный и снова пытаюсь его обнаружить, он показывает только 3D модель и без звука.
Кроме того, как я могу сделать обратный вызов, чтобы обнаружить, что изображение обнаружено или не обнаружено, чтобы показать 2D-эффект на экране для этого изображения? Я не могу использовать - (void)renderer:(id)renderer willUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor
, потому что это не будет эффективно использовать память.
- (void)renderer:(id<SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor {
if ([anchor isKindOfClass:[ARImageAnchor class]]) {
ARImageAnchor * imageAnchor = (ARImageAnchor *)anchor;
ARReferenceImage * referenceImage = imageAnchor.referenceImage;
if ([referenceImage.name isEqual: @"marker_ship"]) {
SCNPlane *plane = [SCNPlane planeWithWidth: referenceImage.physicalSize.width height:referenceImage.physicalSize.height];
SCNNode *planeNode = [SCNNode nodeWithGeometry:plane];
planeNode.eulerAngles = SCNVector3Make(-M_PI/2.0, 0, 0);
plane.firstMaterial.diffuse.contents=[UIColor colorWithWhite:1 alpha:.2];
SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
SCNNode *rootNode = scene.rootNode;
SCNAudioSource * audioSource = [SCNAudioSource audioSourceNamed:@"ship.mp3"];
audioSource.loops=YES;
audioSource.shouldStream = NO;
[audioSource load];
SCNAudioPlayer * audioPlayer = [SCNAudioPlayer audioPlayerWithSource:audioSource];
[planeNode addAudioPlayer:audioPlayer];
rootNode.position = SCNVector3Zero;
rootNode.position = SCNVector3Make(0, 0, 0);
rootNode.eulerAngles = SCNVector3Make(-M_PI/2.0, M_PI, 0);
[planeNode addChildNode:rootNode];
[node addChildNode:planeNode];
}
}