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

Awe*_*ess 1 3d camera ios 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]);
}
Run Code Online (Sandbox Code Playgroud)

我正在运行最新 iOS 11 Beta 的 10.5 英寸 iPad Pro 上进行测试。

meo*_*dog 5

这是由于一个误解:视图矩阵的第 4不是相机的位置。

这是因为视图矩阵是相机变换矩阵的矩阵,即将其乘以指向相机局部基础的世界点变换。

R对于具有旋转矩阵(3x3) 和位置 的相机c,将其视图矩阵V(4x4) 乘以一个点p相当于:

在此输入图像描述

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

在此输入图像描述

因此,为了获得相机的实际位置,我们必须将第 4乘以[减去]视图矩阵左上角 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
Run Code Online (Sandbox Code Playgroud)

(抱歉,我不知道 Objective-C 或 ARKit 的具体细节;希望您能理解这个伪代码的要点)