ARKit基础(二)——ARCamera

2018-08-16  本文已影响0人  梁间

ARCamera 是捕捉现实世界图像的相机,同时也是3D虚拟世界的相机。

这个view主要是输出ARCamera的五个基础属性:

transform: matrix_float4x4 相机的位置姿态

eulerangles: vector_float3 相机方向的矢量欧拉角

imageResolution: CGSize 相机获取到图像的大小(像素)

intrinsics: matrix_float3x3 相机内参矩阵

projectionMatrix: matrix_float4x4 投影矩阵

这次我们换一种加载模型的方式

    //从文件中获取飞船节点
    SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
    shipNode = scene.rootNode.childNodes[0];
    
    //对飞船进行缩放,设定飞船的位置,飞船的所有子节点也需要缩放
    shipNode.scale = SCNVector3Make(0.2, 0.2, 0.2);
    shipNode.position = SCNVector3Make(0, -1,-1.8);
    for (SCNNode *node in shipNode.childNodes) {
        node.scale = SCNVector3Make(0.2, 0.2, 0.2);
    }

    // 把飞船加入场景的根结点
    [sceneView.scene.rootNode addChildNode:shipNode];

我们使用ARSessionDelegate来捕获的视频帧图像和跟踪状态。

-(void)session:(ARSession *)session didUpdateFrame:(nonnull ARFrame *)frame{
    ... ...
}

完整代码:

@interface ARCameraViewController ()<ARSCNViewDelegate,ARSessionDelegate>{
    IBOutlet ARSCNView *sceneView;
    IBOutlet UILabel *label;
    
    SCNNode *shipNode;
}

@end

@implementation ARCameraViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // Set the session's delegate
    sceneView.session.delegate=self;
    
    SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
    shipNode = scene.rootNode.childNodes[0];
   
    shipNode.scale = SCNVector3Make(0.2, 0.2, 0.2);
    shipNode.position = SCNVector3Make(0, -1,-1.8);
    for (SCNNode *node in shipNode.childNodes) {
        node.scale = SCNVector3Make(0.2, 0.2, 0.2);
        node.position = SCNVector3Make(0, -1,-1.8);
    }

    [sceneView.scene.rootNode addChildNode:shipNode];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new];
    [sceneView.session runWithConfiguration:configuration];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [sceneView.session pause];
}

-(void)session:(ARSession *)session didUpdateFrame:(nonnull ARFrame *)frame{
    matrix_float4x4 matrix=frame.camera.transform;
    
    NSMutableString *matrixStr=[[NSMutableString alloc]init];
    [matrixStr appendString:@"transform:\n"];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][0],matrix.columns[1][0],matrix.columns[2][0],matrix.columns[3][0]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][1],matrix.columns[1][1],matrix.columns[2][1],matrix.columns[3][1]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][2],matrix.columns[1][2],matrix.columns[2][2],matrix.columns[3][2]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][3],matrix.columns[1][3],matrix.columns[2][3],matrix.columns[3][3]]];
    
    vector_float3 eulerangles=frame.camera.eulerAngles;
    [matrixStr appendString:@"eulerangles:\n"];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f\n",eulerangles.x, eulerangles.y,eulerangles.z]];
    
    CGSize size=frame.camera.imageResolution;
    [matrixStr appendString:@"imageResolution:\n"];
     [matrixStr appendString:[NSString stringWithFormat:@"%.0f  %.0f\n",size.width, size.height]];
    
    matrix_float3x3 intrinsics=frame.camera.intrinsics;
    [matrixStr appendString:@"intrinsics:\n"];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f\n",intrinsics.columns[0][0],intrinsics.columns[1][0],intrinsics.columns[2][0]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f\n",intrinsics.columns[0][1],intrinsics.columns[1][1],intrinsics.columns[2][1]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f\n",intrinsics.columns[0][2],intrinsics.columns[1][2],intrinsics.columns[2][2]]];
    
    matrix=frame.camera.projectionMatrix;
    [matrixStr appendString:@"projectionMatrix:\n"];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][0],matrix.columns[1][0],matrix.columns[2][0],matrix.columns[3][0]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][1],matrix.columns[1][1],matrix.columns[2][1],matrix.columns[3][1]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][2],matrix.columns[1][2],matrix.columns[2][2],matrix.columns[3][2]]];
    [matrixStr appendString:[NSString stringWithFormat:@"%.2f  %.2f  %.2f  %.2f\n",matrix.columns[0][3],matrix.columns[1][3],matrix.columns[2][3],matrix.columns[3][3]]];
    
  
    label.backgroundColor=[UIColor lightGrayColor];
    label.text=matrixStr;
    
    //飞船y轴转角跟随相机变化
    shipNode.eulerAngles=SCNVector3Make(0, eulerangles.y, 0);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
上一篇下一篇

猜你喜欢

热点阅读