【问题标题】:iPhone rotation applied to a 3d objectiPhone 旋转应用于 3d 对象
【发布时间】:2017-11-20 03:23:04
【问题描述】:

您从 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 中删除第 46 行 [ship runAction: etc.. 处的动画,并且不允许第 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 对象(飞机)不会跟随手机的旋转。投球类作品。

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

【问题讨论】:

  • 使用ship.orientation 代替ship.rotation 解决了这个问题。谢谢@orangenkopf

标签: ios objective-c scenekit core-motion


【解决方案1】:

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

四分量旋转向量指定方向 前三个分量中的旋转轴和 第四个中的旋转角度(以弧度为单位)。

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

要么将四元数分配给SCNNode 的orientation 属性,要么使用CMAttitude 的偏航角、俯仰角和滚动角并将这些分配给SCNNode 的eulerAngles 属性:

节点的方向,表示为俯仰角、偏航角和滚动角, 每个以弧度为单位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多