相关疑难解决方法(0)

SceneKit - 映射物理360度旋转

我很难将设备运动(传感器融合)映射到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 …

objective-c quaternions euler-angles core-motion scenekit

18
推荐指数
2
解决办法
5922
查看次数

随着iOS设备的移动,cameranode旋转

这是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 …

ios cmmotionmanager scenekit scnnode

13
推荐指数
1
解决办法
2404
查看次数

用核心运动计算精益角度

我的申请记录会话.当用户启动记录会话时,我开始从设备的CMMotionManager对象收集数据并将它们存储在CoreData上以便稍后处理和显示.我收集的数据包括gps数据,加速度计数据和陀螺仪数据.数据频率为10Hz.

目前,我正在努力用运动数据计算设备的倾斜角度.可以通过使用重力数据来计算设备的哪一侧着陆,但是我想要计算用户与地面之间的左右角度,而不管行进方向如何.

这个问题需要一些线性代数知识来解决.例如,对于某些点的计算,我必须计算计算平面上的3D线的方程.我正在研究这一天,而且它变得越来越复杂.我根本不擅长数学.一些与该问题相关的数学例子也很受欢迎.

iphone math linear-algebra ios core-motion

6
推荐指数
1
解决办法
4525
查看次数