iPhone 应用于 3d 对象的旋转

iPhone rotation applied to a 3d object

您从 CMAttitude 获得的四元数似乎有缺陷。在 Unity 中,我可以获得 iPhone 的旋转,将其应用于 3d 对象,并且该对象将随着 iPhone 的旋转而旋转。在Xcode好像不一样。

要设置快速测试项目,请按照下列步骤操作:

  1. 在 Xcode 中,从 iOS > 游戏模板 创建一个新项目(这给了我们一个 3d 对象来测试上).

  2. GameViewController.h中添加#import <CoreMotion/CoreMotion.h>@property (strong, nonatomic) CMMotionManager *motionManager;

  3. GameViewController.m 中删除 line:46 [ship runAction: etc.. 处的动画并且不允许 line:55 处的相机控制(不需要)

  4. GameViewController.m添加到ViewDidLoad的底部

    self.motionManager = [[CMMotionManager alloc] init];
    self.motionManager.deviceMotionUpdateInterval = .1;
    
    [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
         withHandler:^(CMDeviceMotion *motion, NSError *error) {
    
             CMQuaternion q = motion.attitude.quaternion;
             ship.rotation = SCNVector4Make(q.x, q.y, q.z, q.w);
    
             if(error){ NSLog(@"%@", error); }
    } ];
    
  5. 为了避免麻烦,在项目 > 目标 > 项目名称 > 部署信息 > 设备方向中,只允许纵向(或者只锁定你的 iPhone的旋转)

当我将它构建到我的 iPhone 时,3d 对象(飞机)不跟随 phone 的旋转。投球类作品。

这是故意的吗?我怎么用错了?

在 3D 中 space 有不同的旋转表示。 您正在使用 rotation 属性 of SCNNode:

The four-component rotation vector specifies the direction of the rotation axis in the first three components and the angle of rotation (in radians) in the fourth.

但是您将设备旋转分配为 quaternion

要么将四元数赋给SCNNodeorientation property of SCNNode or use the yaw, pitch and roll angles of CMAttitude and assign these to the eulerAngles属性:

The node’s orientation, expressed as pitch, yaw, and roll angles, each in radians.