SwiftUI + RealityKit 实现简单AR测距

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()
                    ClearButton.padding()
                }
                Spacer()
                Te
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值