Сделайте положение фигуры фиксированным в предварительном просмотре камеры iOS

Я работаю над приложением на базе камеры iOS, в котором мне нужно захватить первую точку, а затем мне нужно нарисовать линию к текущей точке фокусировки к первой захваченной точке!!! MagicPlan работает таким образом. Пожалуйста, смотрите изображение:

Пример MagicPlan

Я попытался зафиксировать точку для первой точки, используя значения акселерометра и угол наклона устройства. Но пока не повезло. И как бы я нарисовал линию до второй точки от первой точки?

Это код, который я пробовал до сих пор:

    if (self.motionManager.deviceMotionAvailable)
    {
        [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
         withHandler: ^(CMDeviceMotion *motion, NSError *error) {

             CATransform3D transform;

             transform = CATransform3DMakeRotation(motion.attitude.pitch, 1, 0, 0);

             transform = CATransform3DRotate(transform,motion.attitude.roll, 0, 1, 0);

             transform = CATransform3DRotate(transform,motion.attitude.yaw, 0, 0, 1);

             self.viewObject.layer.transform = transform;

         }];
    }


    if (self.motionManager.deviceMotionActive)
    {
        /**
         *  Pulling gravity values from deviceMotion sensor
         */
        CGFloat x = [self convertRadianToDegree:self.motionManager.deviceMotion.gravity.x];
        CGFloat y = [self convertRadianToDegree:self.motionManager.deviceMotion.gravity.y];
        CGFloat z = [self convertRadianToDegree:self.motionManager.deviceMotion.gravity.z];

        CGFloat r = sqrtf(x*x + y*y + z*z);

        /**
         *  Calculating device forward/backward title angle in degrees
         */
        CGFloat tiltForwardBackward = acosf(z/r) * 180.0f / M_PI - 90.0f;

        [self.lblTilForwardBackward setText:[@(tiltForwardBackward) stringValue]];
    }

Пожалуйста, предложите любые идеи. Любая помощь будет оценена. Благодарю.

1 ответ

Решение

У вас есть много вопросов для решения здесь. Это не просто вопрос настройки ориентации камеры, поскольку высота, на которой держится камера, и положение камеры в комнате также меняются. Даже в MagicPlan, когда человек поворачивается, камера движется (вращается вокруг оси, проходящей через голову человека до его ног).

Существует довольно много алгебраических и матричных операций вращения / перевода, которые нужно отработать. Никто не собирается делать это для вас. Вы должны будете все это выяснить и получить самостоятельно (или искать по старым учебникам по графике).

Я предлагаю сделать что-то прямое и многошаговое, насколько это возможно (чтобы вы могли отлаживать каждый шаг по пути). Предположим, плоская земля (в помещении).

  1. Получить положение камеры / ориентация / фокусное расстояние из первого снимка.
  2. Определите точку соприкосновения в реальных декартовых координатах (начните с видео-координат и переведите через проекцию по крену / тангажу / рысканию и трассировке лучей на землю (используя высоту камеры).
  3. Из фокусного расстояния вы можете определить поле зрения и глубину до центра поля зрения, используя ориентацию камеры и расстояние от центра экрана до щелчка, чтобы определить смещение xyz от некоторого начала (возможно, ваши ноги).
  4. Определите и отследите положение и ориентацию камеры относительно этого источника.
  5. На втором снимке (или при пробуждении) определите расстояние (центр или точка касания) от начала координат и точный xyz (как указано выше).
  6. Когда у вас есть эти две точки в xyz, вы можете построить линию, взяв стандартную ортогональную проекцию на плоскость обзора. Отсечение по мере необходимости в случае, если исходная точка находится вне поля зрения.
Другие вопросы по тегам