Tag: 四元数

iDevice态度:稳定四元数

我试图使用iDevice的态度self.motionManager.deviceMotion.attitude.quaternion设备搁在桌子上,但价值观是不一样的。 如何稳定这些值而不会导致不好的旋转? 我正在使用设备姿态旋转相机节点。 (x = -0.0055437298906573507, y = -0.0078092851375721247, z = -0.041180405121897398, w = 0.999105828407855) (x = -0.0061666945840810842, y = -0.0067849414785486747, z = -0.041464744435584115, w = 0.99909789881469635) (x = -0.0057767614213563457, y = -0.0075097232630314727, z = -0.041803806548186787, w = 0.99908091506248087) (x = -0.0054897030127900098, y = -0.0077124534854605253, z = -0.04219926058901851, w = 0.99906436410664467) (x = -0.0052714642886002782, y […]

如何使用平移手势使用四元数在SceneKit中旋转摄像机

我正在使用iOS SceneKit框架构build360video查看器。 我想使用UIPanGestureRecognizer来控制相机的方向。 SCNNode有几个属性可以用来指定它们的旋转: rotation (旋转matrix), orientation (四元数), eulerAngles (每个轴angular度)。 我读过的一切都是为了避免使用欧拉angular度来避免万向locking 。 我想用四元数的原因,我不会在这里进入。 我无法正常工作。 相机控制几乎是我想要的地方,但有什么问题。 尽pipe我试图只影响X轴和Y轴,但看起来好像相机正在围绕Z轴旋转。 我相信这个问题与我的四元数乘法逻辑有关。 我没有做任何与四元年相关的东西(我的平底锅手势处理器在这里: func didPan(recognizer: UIPanGestureRecognizer) { switch recognizer.state { case .Began: self.previousPanTranslation = .zero case .Changed: guard let previous = self.previousPanTranslation else { assertionFailure("Attempt to unwrap previous pan translation failed.") return } // Calculate how much translation occurred between […]

Core Motion控制的SceneKit相机如何避免晃动?

我使用本答案中描述的CMDeviceMotion扩展将SceneKit相机设置为当前的CMDeviceMotion姿态: func deviceDidMove(motion: CMDeviceMotion?, error: NSError?) { if let motion = motion { let orientation = motion.gaze(atOrientation: UIApplication.sharedApplication().statusBarOrientation) cameraNode.orientation = orientation } } 这工作很好,但是,我想阻止旋转(滚动),只允许相机转身(偏航)和俯仰。 我试图将四元数转换回欧拉angular,并简单地离开滚动0: cameraNode.eulerAngles = SCNVector3( x: orientation.pitch(), y: orientation.yaw(), z: 0) 但是,这只适用于偏航运动的一半。 另一半,相机颠倒了。 我怀疑这是涉及欧拉angular的万向节锁问题。 四元数对我来说有点像黑魔法,但是有没有办法直接在四元数水平上去掉滚动分量,这样我可以避开欧拉angular?

态度变化 – angular度和轴问题 – 四元math

我有一个应用程序loggingangular度,当用户在一个对象周围走动时,指向设备(最好)在对象的中心。 angular度根据用户的指令重置 – 参考姿态得到重置。 使用欧拉angular产生的Gimbal锁,所以我目前正在使用四元数和计算angular度这样: double angleFromLastPosition = acos(fromLastPositionAttitude.quaternion.w) * 2.0f; 这发出了良好的精度,它完美的工作,如果设备的俯仰和偏航不会改变。 换句话说,当angular度显示360度时,我最终会在圆圈的起始位置。 问题1:如果设备的偏航和俯仰发生轻微变化(用户不直接指向对象的中心),angleFromLastPosition也是如此。 我理解这一部分,因为我的angular度公式只是显示了3D空间中两个设备态度之间的angular度。 场景: 我标记旋转姿态的开始,并开始围绕对象在一个圆圈中指向中心 我停在45度,并通过指向更高或更低来改变设备的音高。 angular度相应地改变。 我想看到的是:即使俯仰或偏航改变,angular度仍然保持在45度。 问题1是,我怎样才能使用四元数来计算设备的滚动量,而忽略其他两个坐标轴的变化(至less在一定的合理度数内)。 问题2:如果我旋转一下,然后完全冻结设备(在三脚架上,所以根本没有晃动),angleFromLastPosition以大约10-20秒的速度漂移1度,而且看起来不是线性的。 换句话说,它起初漂移很快,然后大大减缓。 有时我完全没有漂移 – 如果设备静止,angular度是坚如磐石的。 这让我迷失在了解正在发生的事情上。 问题2,这里发生了什么,我该如何照顾漂stream? 我经历了不less篇文章和教程,现在四元math已经超越了我,希望有人能够帮助提示,链接或几行代码。

使用四元数来代替滚动,俯仰和偏航来跟踪设备的运动

请耐心解决我长期以来的问题,我想尽可能使之清楚。 我想要做的是,当使用相机拍摄照片时,获取姿态(滚动音高和偏航),然后将姿态值保存到nsuserdefaults。 保存后,方向改变,然后尝试通过不断比较姿态值(保存的和当前的)来使手机达到与拍摄图像相同的姿态。 为了界面的目的,用户界面在屏幕上有3个点(每个姿态参数一个),以指导拍摄的正确方向。 在达到正确态度时,屏幕上显示匹配标志。 我一直在find滚动,俯仰和偏航的值: CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion; myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w – quat.x*quat.z), 1 – 2*quat.y*quat.y – 2*quat.z*quat.z)) ; myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 – 2*quat.x*quat.x – 2*quat.z*quat.z)); myYaw = radiansToDegrees(2*(quat.x*quat.y + quat.w*quat.z)); 当我注意到在偏航值有一些差距,我search,可以从这里find: 链接 ,那 从四元数的偏航,俯仰和滚转,你将会遇到同样的问题,就好像你正在使用偏航,俯仰和滚转。 你必须在你的代码中四处使用四元数,并忘记偏航,俯仰和滚转 所以现在我想我必须再次编码一切…请你能如此友好的指向我为此目的使用四元数的示例代码? 这是我正在处理的代码: 在ViewController.m中,在图像中:didFinishSavingWithError: [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) { CMQuaternion quat = […]