随着iOS设备移动,cameranode旋转

随着iOS设备移动,cameranode旋转,第1张

概述是360度视频播放器项目. 我将一个cameranode(SCNNode)添加到根节点,cameranode放在SCNSphere的中心(0,0,0),现在可以播放视频. 现在我必须使用devicemotion.设备移动时,我需要旋转相机.不只是旋转一定的角度. (不只是设备移动,当我拿着一个设备,我的移动的方式,因为设备移动,因为我发现如果我使用deviceMotion.attitude.rol 是360度视频播放器项目.

我将一个cameranode(SCNNode)添加到根节点,cameranode放在SCNSphere的中心(0,0),现在可以播放视频.

现在我必须使用devicemotion.设备移动时,我需要旋转相机.不只是旋转一定的角度. (不只是设备移动,当我拿着一个设备,我的移动的方式,因为设备移动,因为我发现如果我使用deviceMotion.attitude.roll,手持设备只有在设备移动时才会移动,而不是当我环绕着设备)

当设备位于(x1,y1,z1)位置时,摄像机将随设备移动而旋转,当位于(x1,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");    }

数学可能是错误的,我不知道为什么我会划分60,但是当我使用[self.cameraNode runAction:[SCNAction rotateByX:-tempY y:tempX z:tempZ duration:0] ].

这是问题?

>我应该使用哪些数据?

CMGyroData或CMDeviceMotion.如果使用CMDeviceMotion,我应该使用哪个具体值? deviceMotion.attitude,deviceMotion.attitude.quaternion,deviceMotion.gravity

>这是旋转摄像师的正确方法?有很多方法,我不知道.

(SCNAction *)rotateByX:(CGfloat)xAngle y:(CGfloat)yAngle z:(CGfloat)zAngle持续时间:(NSTimeInterval)duration;

(SCNAction *)rotatetoX:(CGfloat)xAngle y:(CGfloat)yAngle z:(CGfloat)zAngle持续时间:(NSTimeInterval)duration;

解决方法 设备运动是最好的,因为它连接在多个传感器中,并以有意义的方式将数据融合在一起.最好避免使用欧拉角,因为它们受到所谓的万向节锁的影响.相反,使用四元数,并设置您的相机方向.

我创建了a Swift class extension for CMDeviceMotion,让您确定设备正在查看(针对屏幕的任何方向).

从那里,直接旋转相机.首先,设置您的设备动作(在视图中出现或其他适当的位置):

if motionManager.deviceMotionAvailable {    motionManager.deviceMotionUpdateInterval = 0.017    motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue(),withHandler: deviceDIDMove)}

然后使用前面提到的CMDeviceMotion扩展来处理deviceDIDMove实现中的这些更新:

func deviceDIDMove(motion: CMDeviceMotion?,error: NSError?) {    if let motion = motion {        yourCameraNode.orIEntation = motion.gaze(atOrIEntation: UIApplication.sharedApplication().statusbarOrIEntation)    }}

而现在,您的相机应该在太空中遵循您的设备方向.

总结

以上是内存溢出为你收集整理的随着iOS设备移动,cameranode旋转全部内容,希望文章能够帮你解决随着iOS设备移动,cameranode旋转所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1097860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存