2

常に「上」を向いている画面に2D画像を描画しようとしています。ユーザーが電話を回転させている場合、2Dオブジェクトがデバイスと一緒に回転しないようにします。常に「垂直に立つ」必要があります。ユーザーが左または右に傾いていることを補正したいのですが、離れたり自分に向かって傾いたりすることはありません。

CoreMotionを使用してデバイスからピッチ、ロール、ヨーを取得していますが、特にユーザーがデバイスを回転させているときに、ポイントを上方向に変換する方法がわかりません。理想的には、これら3つの数値を単一の値に変換して、三角法のすべてを再学習することなく、どちらの方向が上にあるかを常に教えてくれるのが理想的です。

3Dティーポットの例を見てきましたが、この例は2Dであり、傾けたり傾けたりする必要がないため、役に立ちません。また、コンパス/磁力計はiPod Touchで実行する必要があるため、使用したくありません。

4

2 に答える 2

2

私が言っていることをよりよく理解するために画像を見てください:

ここに画像の説明を入力してください

したがって、XY平面にのみ関心があります。加速度計は、常に自由落下に対するデバイスの加速度を測定します。したがって、画像上にある状態でデバイスを保持している場合、加速度の値は(0、-1、0)です。デバイスを時計回りに45度傾けると、値は(0.707、-0.707、0)になります。現在の加速度値といくつかの基準軸の内積を計算することにより、角度を取得できます。上向きベクトルを使用している場合、軸は(0,1,0)です。つまり、内積は

0*0.707 - 1*0.707 + 0*0 = -0.707

これは正確にacos(-0.707)=45度です。したがって、画像を静止させたい場合は、画像を裏側、つまりXY平面で-45度回転させる必要があります。Z値を無視する場合は、X軸とY軸のみを使用します:(X_ACCEL、Y_ACCEL、0)。そのベクトルを繰り込む必要があります(大きさ1を与える必要があります)。次に、説明したように角度を計算します。

于 2012-10-21T02:11:09.727 に答える
1

Appleはこのためのオブザーバーを提供しています。これが例です。

File.h

#import <UIKit/UIKit.h>

@interface RotationAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

-(void)orientationChanged;
@end

File.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    //Get the device object
    UIDevice *device = [UIDevice currentDevice];

    //Tell it to start monitoring rthe accelermeter for orientation
    [device beginGeneratingDeviceOrientationNotifications];

    //Get the notification center for the app
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

    //Add yourself an observer
    [nc addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:device];

    HeavyViewController *hvc = [[HeavyViewController alloc] init];
    [[self window] setRootViewController:hvc];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}




- (void)orientationChanged:(NSNotification *)note
{
    NSLog(@"OrientationChanged: %d", [[note object] orientation]);
    //You can use this method to change your shape.
}
于 2012-10-21T02:01:05.057 に答える