afjkの技術メモ

主に技術系備忘録

端末の傾きに合わせて3Dオブジェクトを表示する方法[cocos3d]

Twidee3Dのハコスコ対応で端末の傾きに合わせてカメラ制御方法を調べたので共有。
iOSアプリ向け。3D表示にcocos3Dを使っています。

  • 実装


iOS cocos3d cameraを端末の姿勢に合わせて制御する

xxScene.h

#import "CC3Scene.h"
#import <CoreMotion/CoreMotion.h>// この行を追加

@interface HelloARScene : CC3Scene {
    CMMotionManager* _motionManager; // この行を追加
}

@end

上記ソースコードを貼り付けて、sceneの初期化時にinitMotionManagerを呼び出せばactiveCameraが端末の姿勢に合わせて向きを更新するようになります。
xxScene.m

-(void) initializeScene {
	:
	CC3Camera* cam = [CC3Camera nodeWithName: @"Camera"];
	cam.location = cc3v( 0.0, 0.0, 18.0 );
	[self addChild: cam];
    
	[self initMotionManager]; //この行を追加

※CoreMotion.frameworkをリンクする必要があります。

  • 簡単な説明

1.CMMotionManagerを使って、端末の姿勢情報を取得。
 CMDeviceMotion.attitudeからは、quaternionやオイラー角など、いろいろな形で端末の姿勢情報を取得できる。ここではquaternion。
2.取得したquaternionを直接activeCameraに設定すると端末の下を向いてしまうので、X軸で90度回転。
3.Portraitの場合は、2まででOK。
  Landscape Rightの場合は、さらにactiveCameraをZ軸で-90度回転。

3Dプログラミングをしていると、大概クォータニオンなどの数学的な箇所でつまづくので、Tips的に参考ソースがあるといいなと。
私も詳しくないので、他の方の方法を参考にしたり、試行錯誤しながらやっています。

カメラのクォータニオンでの回転方法はこちらを参考にしました。
iphone - Cocos3d and augmented reality - Stack Overflow