AR项目实践二:ar直尺

本文介绍了如何使用AR技术实现一个虚拟直尺。首先,通过ARSCNView+Extension和SCNVector3+Extension获取三维坐标和相机实时位置。接着,利用hitTest方法探测真实世界中的特征点。然后,计算两点间的距离以确定直尺长度,并创建line节点。最后,展示最终代码和实际效果。
摘要由CSDN通过智能技术生成

1. 搭载初始代码

这一部分比较简单就不再秒速了

xib文件


import UIKit
import ARKit
import SceneKit


class ViewController: UIViewController {

    @IBOutlet weak var scenview: ARSCNView!

    @IBOutlet weak var targetImg: UIImageView!
    @IBOutlet weak var infoLalbel: UILabel!
    @IBOutlet weak var stackView: UIStackView!

    var session = ARSession()//session
    var configuration = ARWorldTrackingConfiguration()//监听



    override func viewDidLoad() {
        super.viewDidLoad()

        self.setup()
        // Do any additional setup after loading the view, typically from a nib.


    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        //全局追踪的方法
        session.run(configuration, options: [.resetTracking,.removeExistingAnchors])

    }



    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        session.pause()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }



    //mark:setup
    func setup()  {
        scenview.delegate = self

        scenview.session = session

        infoLalbel.text = "初始化中..."
    }


}



extension ViewController: ARSCNViewDelegate {
     //改变摄像头的焦点就能调用这个方法
    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

//        DispatchQueue.main.async {
   
//            self.scanWorld()
//        }

    }

    func session(_ session: ARSession, didFailWithError error: Error) {

        infoLalbel.text = "错误"
    }

    func sessionWasInterrupted(_ session: ARSession) {

        infoLalbel.text = "中断~"
    }

    func sessionInterruptionEnded(_ session: ARSession) {

        infoLalbel.text = "结束"
    }

}

2. 获取三维坐标,获取相机的实时位置

编写两个扩展ARSCNView+Extension 和 SCNVector3 + Extension

ARSCNView+Extension

extension ARSCNView{
    //    拿到三维坐标
    func worldVector(for position: CGPoint) -> SCNVector3?{

        let results = self.hitTest(position, types: [.featurePoint])


        guard let result = results.first else {
            return nil
        }


        //将拿到的点转化为三维坐标
        return SCNVector3.positionTrasform(result.worldTransform)
    }

SCNVector3 + Extension

 //  拿到镜头的坐标
    static func positionTrasform(_ tranform: matrix_float4x4) -> SCNVector3 {

        return SCNVector3Make(tranform.columns.3.x, tranform.columns.3.y, tranform.columns.3.z)
}
知识补充
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值