ARKit - 为什么旋转设备时相机的 viewMatrix 位置会发生变化?
ARKit - Why is the camera's viewMatrix position changing when the device is rotated?
当我围绕某个轴旋转我的测试设备时,相机的 viewMatrix 的 x 轴位置值(第 3 列,第 1 行)发生显着变化。当仅设备的旋转角度改变 180 度时,沿 x 轴平移大约一米。如果我将 x 位置 returns 旋转 360 度到它的起始 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]);
}
我正在测试 10.5" iPad Pro 运行 最新的 iOS 11 beta。
这是由于一个误解:视图矩阵的第4列是不是相机的位置。
这是因为视图矩阵是摄像机变换矩阵的逆,即将它乘以一个世界点变换点到摄像机的局部基础。
对于具有旋转矩阵 R
(3x3) 和位置 c
的相机,将其视图矩阵 V
(4x4) 与点 p
相乘相当于:
我们可以推断出视图矩阵具有以下构造:
Therefore, to obtain the actual position of the camera, we must
multiply the 4th column by [minus] the transpose / inverse
of the top-left 3x3 sub-matrix of the view matrix.
即,类似于:
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 细节;希望你能理解这段伪代码的要点)
通过以下方法获取相机每一帧的当前变换
func session(_ session: ARSession, didUpdate frame: ARFrame)
{
let currentTransform = frame.camera.transform
}
当我围绕某个轴旋转我的测试设备时,相机的 viewMatrix 的 x 轴位置值(第 3 列,第 1 行)发生显着变化。当仅设备的旋转角度改变 180 度时,沿 x 轴平移大约一米。如果我将 x 位置 returns 旋转 360 度到它的起始 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]);
}
我正在测试 10.5" iPad Pro 运行 最新的 iOS 11 beta。
这是由于一个误解:视图矩阵的第4列是不是相机的位置。
这是因为视图矩阵是摄像机变换矩阵的逆,即将它乘以一个世界点变换点到摄像机的局部基础。
对于具有旋转矩阵 R
(3x3) 和位置 c
的相机,将其视图矩阵 V
(4x4) 与点 p
相乘相当于:
我们可以推断出视图矩阵具有以下构造:
Therefore, to obtain the actual position of the camera, we must multiply the 4th column by [minus] the transpose / inverse of the top-left 3x3 sub-matrix of the view matrix.
即,类似于:
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 细节;希望你能理解这段伪代码的要点)
通过以下方法获取相机每一帧的当前变换
func session(_ session: ARSession, didUpdate frame: ARFrame)
{
let currentTransform = frame.camera.transform
}