Xcode 12.5.1 SwiftUI ARKit RealityKit MacOS 11.5.1
本demo只是为了学习realitykit的使用,实际如果制作AR测距,推荐使用SceneKit来描绘点和线与文字。
效果如图
SwiftUI+RealityKit实现简单AR测距
首先在Xcode新建一个工程,选择Augmented Reality App.建好之后,会有默认的一个3d模型文件和一段默认的ARViewContainer的代码,运行后,当屏幕中心点找到水平面后,会显示一个立方体模型。
我们可以不用这个模型,用我们自己的代码替代
struct ARViewContainer: UIViewRepresentable {
@EnvironmentObject var vm: ViewModel
func makeUIView(context: Context) -> some UIView {
return vm.arView
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
还是用熟悉的MVVM模式来设计我们的app,新建一个swift文件,起名为ViewModel.swift
import SwiftUI
import RealityKit
import ARKit
class ViewModel: ObservableObject {
// static let shared = ViewModel()
@Published var arView: ARView!
@Published var position: CGPoint = .zero
// MARK: - 记录屏幕上设置的点的位置
@Published var simd_position: [simd_float4x4] = []
// MARK: - 测量的距离
@Published var distance: Float = 0.0
// MARK: - 移动屏幕时定时发送过来的点,在有新的点时,旧的点要remove(anchor)
var moveAnchorEntity: AnchorEntity?
// MARK: - 移动屏幕时画的线,在有新的点时,旧的线要remove(anchor)
var lineAnchorEntity: AnchorEntity?
var sphere: ModelEntity?
init() {
arView = ARView(frame: .zero)
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]//.horizontal
arView.session.run(configuration)
}
}
arView是ARKit的主视图,在初始化时初始化为可跟踪镜头的配置模式
测距我采用的方式是,第一个点使用手机屏幕的中心点,设置完第一个点后,启动定时器,实时将屏幕中心点传递给ViewModel,让ARKit计算实际物理世界中的点,并显示在arView中,同时画出两个点的连线。
苹果自带的测距仪App我不知道是不是用这种原理实现,因为我也是初次接触ARKit,所以只能用这种笨方法。
以下是View视图ContentView的源码
import SwiftUI
import RealityKit
import Combine
struct ContentView : View {
@StateObject var vm: ViewModel = ViewModel()
@State var timer = Timer.publish(every: 0.1, on: .main, in: .common)
@State var cancellable: Cancellable? = nil
var body: some View {
ZStack {
ARViewContainer()
.edgesIgnoringSafeArea(.all)
.environmentObject(vm)
VStack {
HStack {
Spacer()