2016-09-09 1 views
-4

Я хочу создать приложения для Android и iOS с дополненной реальностью и GPS. Это приложение должно распознавать большие объекты камерой (например, автомобили, здания) и создавать некоторые работы на этих объектах. У нас есть все узнаваемые объекты GPS-координаты и фотографии этого места. Это приложение должно работать как - http://med44.com/v2/freshkills.php.Я хочу найти библиотеку для программы дополненной реальности + GPS на IOS и Android

Id нашли Librarys:

ARToolkit - бесплатно и иметь все инструменты, но я думаю, что это будет трудно программировать, и я буду тратить много времени на его изучение

vuforia - в моем мнение лучший способ запрограммировать это приложение, но не работает с местоположением GPS. Это проще, чем другие

gimbal = vuforia + GPS, но он не работает в Российской Федерации.

layar - Я не понимал, какую задачу AR он может решить, но он выглядит как платформа Sass, которую вы можете добавить в свое приложение. Выглядит отлично, но я не знаю: может ли он решить мои задачи программирования?

arlab - информация об этом отсутствует. Это либрари может решить все мои задачи?

UPD: Я нашел новый lybrary - wikitube, но я не знаю, что это хороший способ программирования моего приложения с ним?

И теперь я думаю о том, какую библиотеку я могу использовать для распознавания и отображения в реальном времени на IOS и Android?

+0

Wikitude - хороший вариант для приложений с дополнением к реальности. Мы можем использовать функции gps и определения местоположения с помощью этого sdk легко –

ответ

0

Используйте wikitude SDK, я недавно реализовал его в одном из моих приложений, и он отлично подходит для распознавания с использованием облака и локально. Приложен пример использования пользователем кода по коду, вам необходимо импортировать их sdk, прежде чем использовать приведенный ниже код!

#define kWTLicenseKey @"put key here" 

#import "WTSimpleClientTrackerViewController.h" 

#import <WikitudeNativeSDK/WikitudeNativeSDK.h> 

#import "StrokedRectangle.h" 
#import "ExternalRenderer.h" 
#import "ScanEvent.h" 
#import "CokeStudioAPI.h" 

@interface WTSimpleClientTrackerViewController() <WTWikitudeNativeSDKDelegate, WTClientTrackerDelegate> 

@property (nonatomic, strong) WTWikitudeNativeSDK       *wikitudeSDK; 
@property (nonatomic, strong) WTClientTracker        *clientTracker; 

@property (nonatomic, strong) EAGLContext         *sharedWikitudeEAGLCameraContext; 

@property (nonatomic, copy) WTWikitudeUpdateHandler       wikitudeUpdateHandler; 
@property (nonatomic, copy) WTWikitudeDrawHandler       wikitudeDrawHandler; 

@property (nonatomic, assign) BOOL           isTracking; 
@property (nonatomic, assign) BOOL           targetFound; 
@property (nonatomic, strong) ExternalRenderer        *renderer; 
@property (nonatomic, strong) StrokedRectangle        *renderableRectangle; 

@end 


@implementation WTSimpleClientTrackerViewController 

#pragma mark UIViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.renderer = [[ExternalRenderer alloc] init]; 
    self.renderableRectangle = [[StrokedRectangle alloc] init]; 
    self.renderableRectangle.scale = 320.0f; 

    self.wikitudeSDK = [[WTWikitudeNativeSDK alloc] initWithRenderingMode:WTRenderingMode_External delegate:self]; 
    [self.wikitudeSDK setLicenseKey:kWTLicenseKey]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveApplicationWillResignActiveNotification:) name:UIApplicationWillResignActiveNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveApplicationDidBecomeActiveNotification:) name:UIApplicationDidBecomeActiveNotification object:nil]; 
    self.navigationController.navigationBar.hidden = true; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveApplicationDidBecomeActiveNotification:) name:kApplicationDidBecomeInActive object:nil]; 


} 

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear: animated]; 
    [[CokeStudioAPI sharedInstance] trackScreen:@"VR Camera"]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [self.renderer setupRenderingWithLayer:[self.eaglView eaglLayer]]; 
    [self.renderer startRenderLoopWithRenderBlock:[self renderBlock]]; 

    [self.wikitudeSDK start:nil completion:^(BOOL isRunning, NSError * __nonnull error) { 
     if (!isRunning) { 
      NSLog(@"Wikitude SDK is not running. Reason: %@", [error localizedDescription]); 
     } 
     else 
     { 
      NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; 
      NSURL *trackerURL = [[paths lastObject] URLByAppendingPathComponent:@"tracker.wtc"]; 

      NSURL *clientTrackerURL = trackerURL; 
      self.clientTracker = [self.wikitudeSDK.trackerManager create2DClientTrackerFromURL:clientTrackerURL extendedTargets:nil andDelegate:self]; 
     } 
    }]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 

    [self.wikitudeSDK stop]; 

    [self.renderer stopRenderLoop]; 
    [self.renderer teardownRendering]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    [self.wikitudeSDK shouldTransitionToSize:size withTransitionCoordinator:coordinator]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


#pragma mark - ExternalRenderer render loop 
- (ExternalRenderBlock)renderBlock 
{ 
    return^(CADisplayLink *displayLink) { 
     if (self.wikitudeUpdateHandler 
      && 
      self.wikitudeDrawHandler) 
     { 
      self.wikitudeUpdateHandler(); 
      self.wikitudeDrawHandler(); 
     } 

     [self.renderer bindBuffer]; 

     if (_isTracking) 
     { 
      [self.renderableRectangle drawInContext:[self.renderer internalContext]]; 
     } 
    }; 
} 

#pragma mark - Notifications 
- (void)didReceiveApplicationWillResignActiveNotification:(NSNotification *)notification 
{ 
    [self.wikitudeSDK stop]; 
    [self dismissViewControllerAnimated:true completion:nil]; 
} 

- (void)didReceiveApplicationDidBecomeActiveNotification:(NSNotification *)notification 
{ 
    [self.wikitudeSDK start:nil completion:^(BOOL isRunning, NSError * __nonnull error) { 
     if (!isRunning) { 
      NSLog(@"Wikitude SDK is not running. Reason: %@", [error localizedDescription]); 
     } 
    }]; 
} 

#pragma mark - Delegation 
#pragma mark WTWikitudeNativeSDKDelegte 
- (void)wikitudeNativeSDK:(WTWikitudeNativeSDK * __nonnull)wikitudeNativeSDK didCreatedExternalUpdateHandler:(WTWikitudeUpdateHandler __nonnull)updateHandler 
{ 
    self.wikitudeUpdateHandler = updateHandler; 
} 

- (void)wikitudeNativeSDK:(WTWikitudeNativeSDK * __nonnull)wikitudeNativeSDK didCreatedExternalDrawHandler:(WTWikitudeDrawHandler __nonnull)drawHandler 
{ 
    self.wikitudeDrawHandler = drawHandler; 
} 

- (EAGLContext *)eaglContextForVideoCameraInWikitudeNativeSDK:(WTWikitudeNativeSDK * __nonnull)wikitudeNativeSDK 
{ 
    if (!_sharedWikitudeEAGLCameraContext) 
    { 
     EAGLContext *rendererContext = [self.renderer internalContext]; 
     self.sharedWikitudeEAGLCameraContext = [[EAGLContext alloc] initWithAPI:[rendererContext API] sharegroup:[rendererContext sharegroup]]; 
    } 
    return self.sharedWikitudeEAGLCameraContext; 
} 

- (CGRect)eaglViewSizeForExternalRenderingInWikitudeNativeSDK:(WTWikitudeNativeSDK * __nonnull)wikitudeNativeSDK 
{ 
    return self.eaglView.bounds; 
} 

- (void)wikitudeNativeSDK:(WTWikitudeNativeSDK * __nonnull)wikitudeNativeSDK didEncounterInternalError:(NSError * __nonnull)error 
{ 
} 

#pragma mark WTClientTrackerDelegate 

- (void)baseTracker:(nonnull WTBaseTracker *)baseTracker didRecognizedTarget:(nonnull WTImageTarget *)recognizedTarget 
{ 

    _isTracking = YES; 
    [self dismissViewControllerAnimated:true completion:nil]; 

    NSDictionary* userInfo = @{@"artistName": [NSString stringWithFormat:@"%@",[recognizedTarget name]]}; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"targetFound" object:self userInfo:userInfo]; 

} 

- (void)baseTracker:(nonnull WTBaseTracker *)baseTracker didTrackTarget:(nonnull WTImageTarget *)trackedTarget 
{ 
    [self.renderableRectangle setProjectionMatrix:trackedTarget.projection]; 
    [self.renderableRectangle setModelViewMatrix:trackedTarget.modelView]; 
} 

- (void)baseTracker:(nonnull WTBaseTracker *)baseTracker didLostTarget:(nonnull WTImageTarget *)lostTarget 
{ 
    _isTracking = NO; 
} 

- (IBAction)doneBtnTapped:(id)sender { 
    [self dismissViewControllerAnimated:true completion:nil]; 
} 

- (void)clientTracker:(nonnull WTClientTracker *)clientTracker didFinishedLoadingTargetCollectionFromURL:(nonnull NSURL *)URL 
{ 
} 

- (void)clientTracker:(nonnull WTClientTracker *)clientTracker didFailToLoadTargetCollectionFromURL:(nonnull NSURL *)URL withError:(nonnull NSError *)error 
{ 
} 
Смежные вопросы