Reality Composer
苹果公司为了填补在3D建模这一块的空白,给我们提供了这样一个强大的3D建模工具——Reality Composer,接下来就让我们研究一下如何使用这件工具。
官网介绍:https://developer.apple.com/documentation/realitykit/creating-3d-content-with-reality-composer
step1——打开方式:xcode中按如下方式打开,新建
step2—— 选择场景
在这里选择你所需要的大场景,相当于RealityKit中的AnchorEntity,在这里共有五种选择,水平面、垂直面、图像、人脸、物体,也就是说可以把虚拟物体定位到这五种真实世界的对象中。
step3——编辑
这里我们就选择官网提供的一个机器人模型来进行reality composer的编辑。
素材地址:https://developer.apple.com/augmented-reality/quick-look/
这次我们就选择最常用的水平面进去,首先映入眼帘的是一个正方体,一个文本,通过触摸板或鼠标操控可以控制移动和旋转,网格即为水平面。
在上方可以选择添加新的物体,点击物体可以在右侧属性板调整属性,也可以对多个物体进行成组操作,类似于把几个物体捆绑在一起,可以赋予相同行为。
step4-添加模型
将下载好的机器人模型直接拖入,点击空白处右侧属性板显示的则是大场景(相当于AnchorEntity)的属性,名字最好设为英文,点击机器人显示的则是模型(相当于ModelEntity)的属性
step5-添加行为
点击右上角行为,选择机器人,选择轻点与翻转即可为机器人添加一个翻转行为,可以选择受影响的对象和操作序列,操作序列就是可以添加多个行为,将不同的行为拉到一起即可让这些行为同时进行,如果想要model有碰撞效果,点击模型,在属性面板中参与物理行为,选择不同的材质即会有不同的碰撞效果。
为了达到该文章的项目需求,我们可以设置成如下行为,场景开始时隐藏机器人,设置触发器为通知,即用代码来添加触发器(需设置一个标识符),触发后实现机器人从远处走到原点处,动画使用的是下载时自带的usdz文件的动画,我们可以将迭代设置为2,让动画执行时间延长。
step6-添加文本标志
在平面中添加一个文本,若能看到文本说明已经检测到平面,这时候就配置完成可以保存文件了。
step7-新建项目文件
xcode新建一个AR项目,将AR模版拖入xcode,写入以下代码,除了label的设置以外就只剩一点点代码了,仔细看看会发现很简单。
//
// ViewController.swift
// RealityComposer
//
// Created by mac on 2022/10/24.
//
import UIKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
var robotWalk: AR.RobotWalk!//由于viewDidload以外也要使用,所以设为全局变量
//添加一个可点击的label,点击召唤机器人
lazy var startLabel:UILabel = {
let startLabel = UILabel()
startLabel.translatesAutoresizingMaskIntoConstraints = false
startLabel.textAlignment = .center
startLabel.text = "点击召唤机器人"
startLabel.textColor = .yellow
startLabel.font = .systemFont(ofSize: 24,weight: .heavy)
return startLabel
}()
override func viewDidLoad() {
super.viewDidLoad()
//给label设置手势
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(tap:)))
view.addSubview(startLabel)
startLabel.isUserInteractionEnabled = true
startLabel.addGestureRecognizer(tap)
//设置label的约束
startLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 70).isActive = true
startLabel.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 100).isActive = true
startLabel.widthAnchor.constraint(equalToConstant: 200).isActive = true
//robotWalk就相当于AnchorEntity,自带的load函数后面的RobotWalk是自己取的场景名,将场景加载出来
//可以进入AR的定义文件中查看
robotWalk = try! AR.loadRobotWalk()
//将场景放入arView
arView.scene.addAnchor(robotWalk)
}
//设置点击事件
@objc func handleTap(tap:UITapGestureRecognizer){
//调用大场景中的notifications,walkstart即为定义的标识符,调用他的post即可触发行为
if tap.state == .ended{
//walkStart被实例成NotificationTrigger,其中有一个post方法发送指令,调用即可触发行为
robotWalk.notifications.walkStart.post()
}
}
}
step8-项目中修改
如果对于物体的属性还需要调整可以直接在xcode中打开文件,修改后代码也会实时更新。
step9-项目演示
RealityComposer项目演示
QuickLook
QuickLook是ios的一个AR集成框架,当app的主要功能不是AR时可以使用QuickLook实现一个简要的AR预览。
官网介绍:https://developer.apple.com/documentation/quicklook
https://developer.apple.com/documentation/arkit/previewing_a_model_with_ar_quick_look
首先可以在Reality Composer中创建一个模型(不包含子节点),导出成reality或usdz格式放入xcode中,接着实现以下代码(在xcode中我放入的模型名叫house)即可生成一个简易的AR模型预览功能。
import UIKit
import ARKit
import QuickLook
class ViewController: UIViewController, QLPreviewControllerDataSource {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let previewController = QLPreviewController()
previewController.dataSource = self
present(previewController, animated: true, completion: nil)
}
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let url = Bundle.main.url(forResource: "house", withExtension: "usdz")!
return url as QLPreviewItem
}
}