我很难将设备运动(传感器融合)映射到SceneKit节点旋转.问题的前提如下,
我有球体,并且相机定位在球体内部,使得球体的几何中心和相机节点的中心重合.我想要实现的是当我围绕一个点物理旋转时,运动也需要准确地映射到相机上.
实施细节如下:
我有一个节点,一个球体作为几何,并且是一个子节点.我正在使用传感器融合来获得姿态四元数,然后将它们转换为欧拉角.代码是:
- (SCNVector3)eulerAnglesFromCMQuaternion:(CMQuaternion) {
GLKQuaternion gq1 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(90), 1, 0, 0);
GLKQuaternion gq2 = GLKQuaternionMake(q.x, q.y, q.z, q.w);
GLKQuaternion qp = GLKQuaternionMultiply(gq1, gq2);
CMQuaternion rq = {.x = qp.x, .y = qp.y, .z = qp.z, .w = qp.w};
CGFloat roll = atan2(-rq.x*rq.z - rq.w*rq.y, .5 - rq.y*rq.y - rq.z*rq.z);
CGFloat pitch = asin(-2*(rq.y*rq.z + rq.w*rq.x));
CGFloat yaw = atan2(rq.x*rq.y - rq.w*rq.z, .5 - rq.x*rq.x - rq.z*rq.z);
return SCNVector3Make(roll, pitch, yaw);
}
Run Code Online (Sandbox Code Playgroud)
转换方程式来自 3D Math Primer for Graphics …
这是360度视频播放器项目.
我添加了一个cameranode(SCNNode)到一个根节点,cameranode被放在了中心(0,0,0)SCNSphere,它现在可以播放视频了.
现在我必须使用devicemotion.设备移动时我需要旋转相机.不只是旋转一定的角度.(不只是设备移动,当我拿着设备时,我的移动方式就像设备移动一样.因为我发现如果我使用deviceMotion.attitude.roll,cameranode仅在设备自行移动时移动,而不是当我绕着设备移动时)
当设备位于(x1,y1,z1)位置时,cameranode将随设备移动而旋转,当设备再次位于(x1,y1,z1)位置时,视图应与我们离开的最后一个相同.
这就是我所做的:
if (self.motionManager.gyroAvailable) {
self.motionManager.gyroUpdateInterval = 1.0/60.0;
[self.motionManager startGyroUpdatesToQueue:self.queue withHandler:^(CMGyroData *gyroData, NSError *error){
if (error) {
[self.motionManager stopGyroUpdates];
NSLog(@"Gyroscope encountered error:%@",error);
}else {
CGFloat tempX = 0;
CGFloat tempY = 0;
CGFloat tempZ = 0;
if ((fabs(gyroData.rotationRate.y)/60) > 0.002) {
tempY = gyroData.rotationRate.y/60;
}
tempX = gyroData.rotationRate.x/60;
tempZ = gyroData.rotationRate.z/60;
[self.cameraNode runAction:[SCNAction rotateByX:-tempY y:tempX z:tempZ duration:0]];
}
}];
}else {
NSLog(@"This device has no gyroscope");
}
Run Code Online (Sandbox Code Playgroud)
数学可能是错误的,我不知道为什么我会划分60,但它似乎是我使用时所需的最接近的值 [self.cameraNode runAction:[SCNAction rotateByX:-tempY …
我的申请记录会话.当用户启动记录会话时,我开始从设备的CMMotionManager对象收集数据并将它们存储在CoreData上以便稍后处理和显示.我收集的数据包括gps数据,加速度计数据和陀螺仪数据.数据频率为10Hz.
目前,我正在努力用运动数据计算设备的倾斜角度.可以通过使用重力数据来计算设备的哪一侧着陆,但是我想要计算用户与地面之间的左右角度,而不管行进方向如何.
这个问题需要一些线性代数知识来解决.例如,对于某些点的计算,我必须计算计算平面上的3D线的方程.我正在研究这一天,而且它变得越来越复杂.我根本不擅长数学.一些与该问题相关的数学例子也很受欢迎.
core-motion ×2
ios ×2
scenekit ×2
euler-angles ×1
iphone ×1
math ×1
objective-c ×1
quaternions ×1
scnnode ×1