Swift에서 Oculus Rift SDK 사용

17028 단어 XcodeSwiftOculus
Mac 앱 설명 언어의 Swift에서 Oclus SDK를 호출하는 단계가 약간 번거로웠기 때문에 단계를 게시합니다.

나는 교토 덴 창안( htp://w w57. 나중에. jp / 쿄토 덴소 앙 / )이라는 전자 공작 서클의 동료와 「켓시·덴저」라고 하는 로봇을 만들고 있어, 머리에 스테레오 카메라 Ovrvision을 설치해, Oculus Rift DK2로 입체적으로 모니터한다 메커니즘을 통합합니다.
htps //w w. 요츠베. 이 m/와 tch? v=ypdVjHlC7Bg
스테레오 카메라 Ovrvision에 대해서는 여기 → ぃぃ : 코m/

로봇을 모니터하는 프로그램을 Mac에서 작성했지만 Oculus Rift와 Ovrvision의 움직임을 연동시키기 위해 Oculus SDK의 API를 사용하여 Oculus Rift의 방향을 읽고 있습니다.
이를 위해 Swift에서 Oculus SDK를 호출해야했습니다.

Oculus Rift를 이러한 용도로 사용하고 싶은 분의 참고가 되셨으면 합니다.

기사 쓰기 시 환경
・Xcode Version 6.1 (6A1052d)
· Oculus SDK 0.4.3 베타

Cocoa Application 프로젝트 만들기



Xcode에서 Cocoa Application 프로젝트를 만듭니다. Language에는 Swift를 선택합니다.

프로젝트에 Oculus 라이브러리 추가



프로젝트에 Oculus SDK의 LibOVR 폴더를 삭제합니다.
※이 때, 「Add to targets:」의 체크를 해제해 둡니다.


Linked Frameworks and Libraries에 Libovr.a를 삭제합니다.


Header Search Paths에 LibOVR/include를 추가합니다.


Objective-C 소스 추가



Oculus 라이브러리는 C++ 용이므로 Swift에서 호출하려면 Objective-C 코드를 추가합니다.
메뉴의 "New File..."에서 "Cocoa Class"를 선택하여 Objective-C 소스를 생성합니다.
브리징 헤더 작성 확인 대화 상자가 표시되므로 YES를 눌러 작성합니다.
※만약 브리징 헤더 작성 확인 다이얼로그가 표시되지 않는 경우는 이쪽 ぃ tp // 코 m / 치토이 2 / ms / 아베 7b58 아 9 644b29 8 c3 를 참고에 추가해 주세요.


여기에서는 클래스 이름을 OvrManager로 둡니다.
C++ 라이브러리를 호출하려면 OvrManager.m 확장자를 .mm로 변경합니다.

Oculus SDK를 호출하는 코드 추가



OvrManager 클래스에 Oculus SDK를 호출하는 코드를 작성합니다.
예를 들어 Oculus Rift의 방향을 읽는 코드를 보여줍니다.

OvrManager.h
#import <Foundation/Foundation.h>

@interface OvrManager : NSObject

- (void) ovrInitialize;
- (void) ovrDestroy;

- (BOOL) ovrGetOrientationYaw:(CGFloat*)yaw Pitch:(CGFloat*)pitch Roll:(CGFloat*)roll;

@end

OvrManager.mm

#import "OvrManager.h"
#import "OVR.H"

@interface  OvrManager()

@property  ovrHmd hmd;

@end

@implementation OvrManager


- (void) ovrInitialize {
    ovr_Initialize();
    self.hmd = ovrHmd_Create(0);

    if (self.hmd) {
        // Get more details about the HMD.
        ovrSizei resolution = self.hmd->Resolution;
        NSLog(@"resolution w:%d,h:%d", resolution.w,resolution.h );

        ovrHmd_ConfigureTracking(self.hmd, ovrTrackingCap_Orientation |
                                 ovrTrackingCap_MagYawCorrection |
                                 ovrTrackingCap_Position, 0);
    }
}

- (BOOL) ovrGetOrientationYaw:(CGFloat*)yaw Pitch:(CGFloat*)pitch Roll:(CGFloat*)roll {
    ovrTrackingState ts  = ovrHmd_GetTrackingState(self.hmd, ovr_GetTimeInSeconds());
    if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) {
        OVR::Posef pose = ts.HeadPose.ThePose;
        float hmdYaw, hmdPitch, hmdRoll;
        pose.Rotation.GetEulerAngles<OVR::Axis_Y, OVR::Axis_X, OVR::Axis_Z>(&hmdYaw, &hmdPitch, &hmdRoll);

        *yaw  = hmdYaw;
        *pitch = hmdPitch;
        *roll = hmdRoll;
        return YES;
    }
    return NO;
}

- (void) ovrDestroy {
    ovrHmd_Destroy(self.hmd);
    ovr_Shutdown();
}

@end


브리징 헤더에 OvrManager.h의 import를 설명합니다.

OvrTest-Bridging-Header.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "OvrManager.h"

코딩 예



예를 들면 타이머가 정기적으로 Oculus Rift의 방향을 로그에 출력하는 코드를 나타냅니다.
실행하고 그것 같은 로그가 흐르면 성공입니다.
정지는 Xcode의 Stop으로 가십시오.

AppDelegate.swift
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!

    // ロックオブジェクト
    private let lockQueue = dispatch_queue_create("qiita.advent2014.swift.oculus.LockQueue", nil)

    private let ovrManager = OvrManager()
    private var timer : NSTimer? = nil

    // 向きの現在値
    private var currentYaw : CGFloat = 0.0
    private var currentPitch : CGFloat = 0.0
    private var currentRoll : CGFloat = 0.0


    func applicationDidFinishLaunching(aNotification: NSNotification) {
        ovrManager.ovrInitialize()
        sensingStart()
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }

    func sensingStart() {
        dispatch_sync(lockQueue, {
            if self.timer != nil {
                return
            }
            self.timer = NSTimer.scheduledTimerWithTimeInterval(0.05,
                target:self,
                selector:Selector("sensingUpdate"),userInfo:nil,repeats:true);
        })
    }

    func sensingStop() {
        dispatch_sync(lockQueue, {
            if self.timer == nil {
                return
            }

            self.timer?.invalidate()
            self.timer = nil
        })
    }

    @objc private  func sensingUpdate() {
        ovrManager.ovrGetOrientationYaw (&currentYaw, pitch: &currentPitch, roll: &currentRoll)
        NSLog("sensingUpdate Yaw:\(currentYaw), Pitch:\(currentPitch), Roll:\(currentRoll)")
    }
}


끝을 향해



내일 12월 06일 기사는
그럼 Oculus를 사용하여 재미있는 Swift 생활을!

좋은 웹페이지 즐겨찾기