ARKit - 当设备旋转时,为什么摄像机的viewMatrix位置会发生变化?

时间:2017-09-09 14:37:04

标签: ios 3d camera arkit

当我围绕某个轴旋转我的测试设备时,相机的viewMatrix的x轴位置值(第3列,第1行)正在发生显着变化。当只有设备的旋转角度改变180度时,沿x轴平移的量程。如果我旋转整整360度,x位置将返回到它的0度值。我根本不翻译设备(忽略轻微的人为错误)。

这是错误还是配置设置问题?有人可以解释为什么只旋转设备时x轴位置会改变吗?还有其他人看到这个吗?

以下是基本代码设置:

@property (nonatomic, strong) ARWorldTrackingConfiguration *arSessionConfiguration;
@property (nonatomic, strong) ARSession *arSession;

- (void)setup
{
  self.arSessionConfiguration = [ARWorldTrackingConfiguration new];
  self.arSessionConfiguration.worldAlignment = ARWorldAlignmentGravity;
  self.arSessionConfiguration.planeDetection = ARPlaneDetectionHorizontal;
  self.arSession = [ARSession new];
  self.arSession.delegate = self;
  [self.arSession runWithConfiguration:self.arSessionConfiguration];
}

- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame
{
  matrix_float4x4 viewMatrix = [frame.camera viewMatrixForOrientation:UIInterfaceOrientationPortrait];
  NSLog(@"%0.2f, %0.2f, %0.2f", viewMatrix.columns[3][0], viewMatrix.columns[3][1], viewMatrix.columns[3][2]);
}

我正在使用运行最新iOS 11测试版的10.5“iPad Pro进行测试。

2 个答案:

答案 0 :(得分:3)

这是由于误解:视图矩阵的4 th 相机的位置。

这是因为视图矩阵是摄像机变换矩阵的,即将它乘以世界点,将其转换为摄像机的本地基础。

对于旋转矩阵为R(3x3)且位置为c的相机,与点V相乘的视图矩阵p(4x4)相当于:

enter image description here

我们可以推断视图矩阵具有以下结构:

enter image description here

  

因此,要获得相机的实际位置,我们必须   将4 th 列乘以[减]转置/逆   视图矩阵的左上角3x3子矩阵。

是的,例如:

matrix_float3x3 topLeftSubMtx = /*viewMatrix[0][0] to viewMatrix[3][3]*/;
vector_float4 rightColumn = viewMatrix.columns[3];
float positionX = -[vector_float4.dotProduct topLeftSubMtx.columns[0], rightColumn];
// similarly for Y and Z

(道歉,因为我不知道Objective-C或ARKit细节;希望你能得到这个伪代码的要点)

答案 1 :(得分:0)

通过以下方法获取摄像机每一帧的当前变换

func session(_ session: ARSession, didUpdate frame: ARFrame) 
{
    let currentTransform = frame.camera.transform    
}