一、对比
Metal项目中,没有资源文件,但是有一个metal文件,是用于编写Shaders[着色器]
的。
二、运行效果
- 屏幕上显示的是相机画面,点击屏幕,就会出现一个立方体。
三、创建AR项目
- Content Technology:Metal渲染框架
- 代码解析:
#import "ViewController.h"
#import "Renderer.h"
@interface ViewController () <MTKViewDelegate, ARSessionDelegate>
//声明会话和渲染器
@property (nonatomic, strong) ARSession *session;
@property (nonatomic, strong) Renderer *renderer;
@end
@interface MTKView () <RenderDestinationProvider>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Create an ARSession
//创建ARSession会话并设置代理
self.session = [ARSession new];
self.session.delegate = self;
// Set the view to use the default device
//设置当前视图为Metal视图
MTKView *view = (MTKView *)self.view;
//设置Metal视图使用系统默认的Metal设备
view.device = MTLCreateSystemDefaultDevice();
//设置Metal视图的背景色和代理
view.backgroundColor = UIColor.clearColor;
view.delegate = self;
//如果当前设备不支持Metal,这里就会提前结束程序
if(!view.device) {
NSLog(@"Metal is not supported on this device");
return;
}
// Configure the renderer to draw to the view
//设置渲染器以将其绘制到视图中
self.renderer = [[Renderer alloc] initWithSession:self.session metalDevice:view.device renderDestinationProvider:view];
//设置渲染器大小
[self.renderer drawRectResized:view.bounds.size];
//向Metal视图中添加点击手势
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
NSMutableArray *gestureRecognizers = [NSMutableArray array];
[gestureRecognizers addObject:tapGesture];
[gestureRecognizers addObjectsFromArray:view.gestureRecognizers];
view.gestureRecognizers = gestureRecognizers;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//创建会话配置对象
ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new];
//运行新建会话
[self.session runWithConfiguration:configuration];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//停止运行会话
[self.session pause];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)handleTap:(UIGestureRecognizer*)gestureRecognize {
ARFrame *currentFrame = [self.session currentFrame];
// Create anchor using the camera's current position
//使用摄像头当前的位置创建一个锚点
if (currentFrame) {
// Create a transform with a translation of 0.2 meters in front of the camera
//创建一个向摄像头前平移0.2m的转换
matrix_float4x4 translation = matrix_identity_float4x4;
translation.columns[3].z = -0.2;
//使用当前帧中摄像头的位置进行转换,转换后得到一个矩阵
matrix_float4x4 transform = matrix_multiply(currentFrame.camera.transform, translation);
// Add a new anchor to the session
//新建一个锚点并添加到会话中
ARAnchor *anchor = [[ARAnchor alloc] initWithTransform:transform];
[self.session addAnchor:anchor];
}
}
#pragma mark - MTKViewDelegate
// Called whenever view changes orientation or layout is changed
//每当视图改变方向或布局时,就会调用这个代理方法
- (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {
[self.renderer drawRectResized:view.bounds.size];
}
// Called whenever the view needs to render
//在视图需要渲染时调用
- (void)drawInMTKView:(nonnull MTKView *)view {
//渲染器更新渲染
[self.renderer update];
}