Подтвердить что ты не робот

Cameranode вращается при перемещении устройства iOS

Это видеопроигрыватель на 360 градусов.

Я добавляю cameranode (SCNNode) в корневой каталог, cameranode помещается в центр (0,0,0) из SCNSphere, он может воспроизводить видео до сих пор.

Теперь я должен использовать devicemotion. Мне нужно повернуть камеру, когда устройство движется. Не просто поверните определенный угол. (Не только движение устройства. Когда я держу устройство, мое движущееся отношение к движению устройства, потому что я обнаружил, что если я использую deviceMotion.attitude.roll, cameranode движется только тогда, когда устройство движется само по себе, а не когда я обхожусь с устройством)

Когда устройство находится в позиции (x1, y1, z1), видеокамера будет вращаться при перемещении устройства, а когда устройство, расположенное в позиции (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");
    }

Математика может быть неправильной, я не знаю, почему я бы разделил 60, но мне кажется, что это самое близкое значение, когда я использую [self.cameraNode runAction:[SCNAction rotateByX:-tempY y:tempX z:tempZ duration:0]];

Здесь проблема?

  • какие данные следует использовать?

CMGyroData или CMDeviceMotion. Если используется CMDeviceMotion, какое конкретное значение я должен использовать? deviceMotion.attitude, deviceMotion.attitude.quaternion, deviceMotion.gravity

  1. который является правильным методом для поворота камеры? Есть много методов, я не уверен.

+ (SCNAction *)rotateByX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle duration:(NSTimeInterval)duration;

+ (SCNAction *)rotateToX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle duration:(NSTimeInterval)duration;

4b9b3361

Ответ 1

Движение устройства лучше всего, поскольку оно связывается с несколькими датчиками и эффективно объединяет данные в значимом ключе. Также лучше избегать использования углов Эйлера, поскольку они страдают от того, что известно как карданный замок. Вместо этого используйте кватернионы и установите для них ориентацию камеры.

Я создал расширение класса Swift для CMDeviceMotion, которое позволит вам определить, на что смотрит устройство (для любой ориентации экрана).

Оттуда просто поворачивать камеру. Сначала настройте движение вашего устройства (в поле зрения появилось или в другом подходящем месте):

if motionManager.deviceMotionAvailable {

    motionManager.deviceMotionUpdateInterval = 0.017
    motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue(), withHandler: deviceDidMove)
}

Затем обработайте эти обновления в вашей реализации deviceDidMove, используя ранее упомянутое расширение CMDeviceMotion:

func deviceDidMove(motion: CMDeviceMotion?, error: NSError?) {

    if let motion = motion {

        yourCameraNode.orientation = motion.gaze(atOrientation: UIApplication.sharedApplication().statusBarOrientation)
    }
}

И теперь ваша камера должна следить за ориентацией ваших устройств в космосе.