0

我正在开发一个基于 iOS 相机的应用程序,其中我必须捕获第一个点,然后我需要将线绘制到当前焦点到第一个捕获点。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]];
    }
4

1 回答 1

1

你有很多问题要在这里解决。这不仅仅是调整相机方向的问题,因为相机的高度和房间中相机的位置也在变化。即使在 MagicPlan 中,当人转身时,相机也会移动(围绕穿过人的头部到他的脚的轴旋转)。

有很多代数和旋转/平移矩阵运算需要解决。没有人会为你做这件事。您必须自己弄清楚并推导出它(或从旧的图形教科书中查找)。

我建议做一些尽可能直接和多步骤的事情(这样你就可以调试每一步)。假设地面平坦(室内环境)。

  1. 从第一个快照中获取相机位置/方向/焦距。
  2. 找出现实世界笛卡尔坐标中的接触点(从视频坐标开始,通过滚动/俯仰/偏航和光线追踪投影转换到地平面(使用相机高度)。
  3. 从焦距中,您可以计算出视野和深度到视野中心,并使用相机方向和点击距屏幕中心的距离确定从某个原点(可能是您的脚)的 xyz 偏移量。
  4. 确定并跟踪相机相对于该原点的位置和方向。
  5. 在第二个快照(或运动唤醒)上,计算(中心或接触点)与原点的距离和精确的 xyz(如上)。
  6. 一旦你在 xyz 中有这两个点,你可以通过将标准正交投影到视图平面上来绘制线。在原始点超出 FOV 的情况下根据需要进行裁剪。
于 2015-04-07T18:41:55.177 回答