使形状的位置固定在 iOS 相机预览中
Make a shape's position fixed on iOS camera preview
我正在开发一个 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]];
}
您这里有很多问题需要解决。这不仅仅是调整相机方向的问题,因为相机所持的高度和相机在房间中的位置也在发生变化。即使在 MagicPlan 中,当人转身时,摄像机也会移动(围绕穿过人头的轴旋转到他的脚)。
有很多代数和 rotation/translation 矩阵运算需要解决。没有人会为你做这件事。你必须自己弄清楚并推导它(或者从旧的图形教科书中查找)。
我建议做一些尽可能直接和多步骤的事情(这样你就可以调试每一步)。假设平地(室内环境)。
- 从第一个快照获取相机 position/orientation/focal 长度。
- 找出真实世界笛卡尔坐标中的触摸点(从视频坐标开始,通过 roll/pitch/yaw 和光线追踪投影平移到地平面(使用相机高度)。
- 根据焦距,您可以计算出视野和视野中心的深度,并使用相机方向和点击距屏幕中心的距离确定距某个原点(可能是您的脚)的 xyz 偏移。
- 确定并跟踪相机相对于原点的位置和方向。
- 在第二个快照(或运动唤醒)上,计算出(中心或触摸点)与原点的距离和精确的 xyz(如上所述)。
- 一旦你在 xyz 中有了这两个点,你就可以通过将标准正交投影到视图平面上来绘制直线。根据需要裁剪以防原点超出 FOV。
我正在开发一个 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]];
}
您这里有很多问题需要解决。这不仅仅是调整相机方向的问题,因为相机所持的高度和相机在房间中的位置也在发生变化。即使在 MagicPlan 中,当人转身时,摄像机也会移动(围绕穿过人头的轴旋转到他的脚)。
有很多代数和 rotation/translation 矩阵运算需要解决。没有人会为你做这件事。你必须自己弄清楚并推导它(或者从旧的图形教科书中查找)。
我建议做一些尽可能直接和多步骤的事情(这样你就可以调试每一步)。假设平地(室内环境)。
- 从第一个快照获取相机 position/orientation/focal 长度。
- 找出真实世界笛卡尔坐标中的触摸点(从视频坐标开始,通过 roll/pitch/yaw 和光线追踪投影平移到地平面(使用相机高度)。
- 根据焦距,您可以计算出视野和视野中心的深度,并使用相机方向和点击距屏幕中心的距离确定距某个原点(可能是您的脚)的 xyz 偏移。
- 确定并跟踪相机相对于原点的位置和方向。
- 在第二个快照(或运动唤醒)上,计算出(中心或触摸点)与原点的距离和精确的 xyz(如上所述)。
- 一旦你在 xyz 中有了这两个点,你就可以通过将标准正交投影到视图平面上来绘制直线。根据需要裁剪以防原点超出 FOV。