在iOS相机预览中固定形状的位置

时间:2015-04-07 13:00:02

标签: ios objective-c augmented-reality ios-camera

我正在开发基于iOS相机的应用程序,我必须捕获第一个点,然后我需要将线条绘制到当前焦点到第一个捕获点! MagicPlan以这种方式工作。请看图片:

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

请提出任何想法。任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

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

需要进行大量的代数和旋转/平移矩阵运算。没有人会为你做这件事。你必须把它全部弄清楚并自己推导出来(或者从旧的图形教科书中查找)。

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

  1. 从第一张快照获取相机位置/方向/焦距。
  2. 找出真实世界中的触摸点笛卡尔坐标(从视频坐标开始,通过滚动/俯仰/偏航和光线跟踪投影转换到地平面(使用摄像机高度)。
  3. 从焦距可以看出视野和景深中心的深度,并使用相机方向和距屏幕中心的点击距离确定xyz偏离某个原点(可能是你的脚)。
  4. 确定并跟踪相机相对于原点的位置和方向。
  5. 在第二个快照(或运动唤醒)上,找出(中心或触摸点)距离原点和精确xyz的距离(如上所示)。
  6. 一旦你在xyz中得到这两个点,就可以通过将标准正交投影带到视图平面上来绘制线条。如果原始点不在FOV中,则根据需要剪裁。