iOS ARKit 2 - маркер с фоновой музыкой и 2d эффектом - PullRequest
0 голосов
/ 09 января 2019

Я разрабатываю приложение для 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];

    }
}
...