Swift에서 Oculus Rift 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.swiftimport 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 (¤tYaw, pitch: ¤tPitch, roll: ¤tRoll)
NSLog("sensingUpdate Yaw:\(currentYaw), Pitch:\(currentPitch), Roll:\(currentRoll)")
}
}
끝을 향해
내일 12월 06일 기사는
그럼 Oculus를 사용하여 재미있는 Swift 생활을!
Reference
이 문제에 관하여(Swift에서 Oculus Rift SDK 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/titoi2/items/4045fef7e8cf236b8d26
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
프로젝트에 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.swiftimport 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 (¤tYaw, pitch: ¤tPitch, roll: ¤tRoll)
NSLog("sensingUpdate Yaw:\(currentYaw), Pitch:\(currentPitch), Roll:\(currentRoll)")
}
}
끝을 향해
내일 12월 06일 기사는
그럼 Oculus를 사용하여 재미있는 Swift 생활을!
Reference
이 문제에 관하여(Swift에서 Oculus Rift SDK 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/titoi2/items/4045fef7e8cf236b8d26
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.swiftimport 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 (¤tYaw, pitch: ¤tPitch, roll: ¤tRoll)
NSLog("sensingUpdate Yaw:\(currentYaw), Pitch:\(currentPitch), Roll:\(currentRoll)")
}
}
끝을 향해
내일 12월 06일 기사는
그럼 Oculus를 사용하여 재미있는 Swift 생활을!
Reference
이 문제에 관하여(Swift에서 Oculus Rift SDK 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/titoi2/items/4045fef7e8cf236b8d26
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 (¤tYaw, pitch: ¤tPitch, roll: ¤tRoll)
NSLog("sensingUpdate Yaw:\(currentYaw), Pitch:\(currentPitch), Roll:\(currentRoll)")
}
}
내일 12월 06일 기사는
그럼 Oculus를 사용하여 재미있는 Swift 생활을!
Reference
이 문제에 관하여(Swift에서 Oculus Rift SDK 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/titoi2/items/4045fef7e8cf236b8d26텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)