2016-09-09 4 views
-4

증강 현실 및 GPS가 포함 된 Android 및 iOS 앱을 만들고 싶습니다. 이 응용 프로그램은 자동차 (건물과 같은)로 큰 개체를 인식하고이 개체에 대한 글을 작성해야합니다. 우리는이 장소의 GPS 좌표와 사진을 모두 인식 할 수있는 대상에서 벗어났습니다. 앱은 - http://med44.com/v2/freshkills.php처럼 작동해야합니다.IOS 및 Android에서 증강 현실 + GPS를 프로그래밍 할 라이브러리를 찾고 싶습니다.

ID가 어떤 librarys 발견

artoolkit을 - 무료 및 모든 악기를 가지고,하지만 난 그것을 프로그램 어려울 것 생각하고, 나는 그것을

vuforia 학습에 의해 많은 시간을 보낼 것입니다 - 내 의견은이 응용 프로그램을 프로그래밍하는 가장 좋은 방법이지만, GPS 위치와 작업 havent. 다른 것보다 쉽습니다

gimbal = vuforia + GPS이지만 러시아 연방에서는 작동하지 않습니다.

layar - 내가 해결할 수있는 AR 작업의 종류를 이해하지 못했지만 앱에 추가 할 수있는 Sass 플랫폼처럼 보입니다. 좋아 보이지만 잘 모릅니다. 프로그래밍 작업을 해결할 수 있습니까?

arlab - 거기에 대한 정보가 없습니다. Lybrary가 모든 작업을 해결할 수 있습니까?

UPD : 새로운 lybrary - wikitube를 찾았지만 내 앱을 프로그래밍하는 좋은 방법이 있는지 모르겠습니다.

그리고 지금 생각해 보면 : IOS 및 Android에서 실시간으로 인식 할 수있는 라이브러리는 무엇입니까?

+0

Wikitude는 증강 현실 앱을위한 좋은 옵션입니다. 우리는이 SDK로 GPS 및 위치 인식 기능을 쉽게 사용할 수 있습니다. –

답변

0

wikitude SDK를 사용하여 최근에 내 앱 중 하나에서 구현했으며 클라우드 및 로컬을 사용하는 인식에 적합합니다. 첨부 된 코드를 사용하여 wikitude를 사용하는 방법에 대한 예가 있습니다. 아래 코드를 사용하기 전에 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 
{ 
}