2015-04-07 3 views
0

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

MagicPlan example

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

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

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]]; 
    } 

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

+0

Возможно, вы можете уточнить свой вопрос. Я не могу следить за тем, что вы пытаетесь сделать. Похоже, вы хотите нарисовать линию между двумя точками? Это показывает, как это сделать. http://stackoverflow.com/questions/6905941/objective-c-draw-line-on-top-of-uiimage-or-uiimageview – LawfulEvil

+0

@LawfulEvil, если вы видите изображение, это приложение MagicPlan, которое просит пользователя захватить изображение в одной точке, а затем, когда пользователь перемещает устройство, квадраты рисуются автоматически. см. его в действии здесь: https://youtu.be/0X-kmUhPC4Q?t=14 –

ответ

1

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

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

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

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

Спасибо за подробное объяснение, я не искал кого-то, чтобы это сделать. Мне нравятся подробные объяснения, как вы это делали. Еще раз спасибо. Но, один вопрос, как я могу получить фокусное расстояние от любого устройства iOS? У вас есть идеи для этого? –

+0

Его изображение EXIF. Http: // StackOverflow.com/questions/22634518/how-to-get-distance-of-object-from-iphone-camera-using-image-exif-meta-data – LawfulEvil

+0

Большое спасибо ... –