我试图通过使用由CoreMotion根据设备旋转生成的CLKQuaternions来实现一些向量的旋转。 以下是我的测试更新类的样子:
var quaternion:GLKQuaternion{
get{
guard let quat = manager.deviceMotion?.attitude.quaternion else {
return GLKQuaternionMake(0,0,0,0)
}
return GLKQuaternionMake(Float(quat.x), Float(quat.y), Float(quat.z), Float(quat.w))
}
}
import UIKit
import GLKit
class QuaternionMovedSupportView: UIView {
var myFrame:CGRect
var controller:OverlayViewController!
var vector=GLKVector3Make(200, 200, 200)
init(frame: CGRect, delegate:OverlayViewController) {
controller=delegate
myFrame=frame
super.init(frame:frame)
NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector: Selector("refreshForQuaternion:"), userInfo: nil, repeats: true)
}
required init?(coder aDecoder: NSCoder) {
fatalError()
}
func refreshForQuaternion(timer:NSTimer){
let referenceQuaternion=BackgroundLocationUpdate.sharedUpdater().quaternion
print("quaternion \(referenceQuaternion.x), \(referenceQuaternion.y), \(referenceQuaternion.z), \(referenceQuaternion.w)")
let adjustedVector=GLKQuaternionRotateVector3(referenceQuaternion, vector);
print("move to \(adjustedVector.x), \(adjustedVector.y), \(adjustedVector.z)")
self.controller.moveSupport(CGPointMake(CGFloat(adjustedVector.y), CGFloat(adjustedVector.z)))
}
之前的实施是错误的,因为它不断加速矢量,这也是其自主运动的原因。 现在它实际上根据设备的移动而移动,但仍以意想不到的方式移动。 特别是当我改变设备标题顺时针方向时,它似乎通过向左移动而正确地表现,但是如果我做了一个圆形转弯,它会重新出现在同一侧。 相反,当我顺时针旋转设备时,盒子会以正确的尺寸徘徊而不会移动到屏幕之外,直到某一点加速并且也会消失在左侧。 相反,当我改变倾斜度时,它会在顶部两个角落之间绘制一种抛物线,并在屏幕中央选择拾取。 这个video显示了这两种行为。
我如何使用态度四元数可能有什么问题?
可以从here下载测试项目并将其安装在您的设备上进行测试。