一、ARkit尺子项目学到了什么?

先看效果,如下图:

  • 1.SCNVector3本质就是一个三维坐标
  • 2.画线的步骤就是:拿到2个坐标 --> 选择“线”这个“几何” --> 渲染--> 最后生成节点。这个过程待会会详细的代码解释。
  • 3.坐标之间的转换,世界坐标、摄像头。这个和SLAM里面的很类似。
  • 4.SCNText,一个很特殊的“几何”,如图中的8.52cm就是用SCNText表示的,当然最后都会放到节点里面去。
  • 5.对节点的使用更加的清晰,每个点、每根线、以及描述的text都会被添加到节点,然后ARSCNView的scene.rootNode.addChildNode(node)

二、下面开始具体的讲解整个实现的逻辑和流程。

先解释下:图中的 白色"+"是始终位于屏幕的正中间的,整个项目都是以这个点为瞄准点。

开始第一步:

extension ARSCNView {//拿到三维坐标func worldVector(for position:CGPoint) ->SCNVector3?{let results = self.hitTest(position, types: [.featurePoint])guard let result = results.first else {return nil}// 获取点的坐标,类型是matrix_float4x4 ,调这个方法就可以拿到相机的镜头return SCNVector3.positionTransform(result.worldTransform)}
}

//  拿到镜头的坐标static func positionTransform(_ transform: matrix_float4x4) -> SCNVector3{return SCNVector3Make(transform.columns.3.x, transform.columns.3.y, transform.columns.3.z)}

  • 1.点击手机屏幕,然后获取到一个CGPoint,
  • 2.通过 self.hitTest(position, types: [.featurePoint]).first 就拿到一个 为matrix_float4x4类型的坐标。
  • 3.通过positionTransform方法得到镜头的坐标。
实话里面到底是如何实现的,我也很想知道。我通过之前对SLAM的学习,大概知道,里面的矩阵变换的过程。对于iOS开发者,知道需要转换即可,具体的深究留到自己对AR的掌握到了一定程度的时候会比较好。

第二步:画线

//画线的方法func drawLine( vector: SCNVector3, color:UIColor) -> SCNNode {let indices: [UInt32] = [0,1] // 指数           //0指:一维,表示点       //1指:二维,表示线//数据来源let source = SCNGeometrySource(vertices: [self,vector])//画什么样的几何---选择线let element =  SCNGeometryElement(indices: indices, primitiveType: .line)let geometry = SCNGeometry(sources: [source], elements: [element])geometry.firstMaterial?.diffuse.contents = colorlet node = SCNNode(geometry: geometry)return node}

  • 1.数据源:两个坐标
  • 2.选择几何模型--线
  • 3.生成节点

第三步:什么时候绘制了?

实在ARSCNViewDelegate中的渲染方法里面进行绘制。具体代码:

 {func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {     DispatchQueue.main.async {self.scanWorld()}}

 //扫描外部真实世界,开始测量func scanWorld() {//我们以中间点为开始点,也就是那个十字标图片指的点为开始的点。guard let worldPosition = sceneView.worldVector(for: view.center) else {return}vectorStart = worldPositioncurrentLine = Line.init(sceneView: self.sceneView, startVector: vectorStart, unit: self.unit)//设置结束的节点vectorEnd = worldPositioncurrentLine?.update(to: vectorEnd)infoLabel.text = currentLine?.distance(to: vectorEnd) ?? "是同一个点"    }}

进行扫描真实的世界,在scanWorld()方法里面调用绘制的方法进行绘制。

三、总结一下思路

  • 选择开始的点
  • 然后开始绘制并计算长度
  • 再次点击屏幕获取终点--结束。

实现的难点:想到坐标的转换、然后绘制的时机、对节点的使用的掌握。

项目代码,我后续会传到GitHub,后面在一起加。

转载于:https://www.cnblogs.com/yuhui-snail/p/8515335.html

ARKit__2_尺子项目相关推荐

  1. Android尺子项目

    Android手机尺子项目 该项目就是让自己的手机屏幕变成一把尺子,看起来比较酷炫,而且可以很容易的进行测量.接下来看一下效果如何. 这个小项目其实没有什么特别的难度,关键是对于xml文件当中的tex ...

  2. Qt开发之画图画一把尺子入门案例项目分享

    Qt开发之画图画一把尺子入门案例项目分享 之前就开发过此项目,一直没有上传源码给大家,今天给大家开发源代码,项目实现截图如下. 该项目是入门级项目对画图知识的使用,以及常用控件的使用,具备研究价值.没 ...

  3. MobileRuler项目(手机尺子)

    下载了很多尺子软件,发现能够测量长距离的app不多,很多app只能测量小于手机屏幕尺寸的物体,这极大地限制了这类app的作用,如果让手机尺子能够移动测量物体,那么手机尺子的使用范围就会大很多.现在又一 ...

  4. iOS超全开源框架、项目和学习资料汇总(1)UI篇

    上下拉刷新控件 **1. ** MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.(推荐) ...

  5. iOS超全开源框架、项目和学习资料汇总:UI篇

    2017-01-30 iOS巍 CocoaChina 原文 上下拉刷新控件 1. MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉 ...

  6. android自定义尺子收集demo

    demo合集: https://github.com/dalong982242260/AndroidRuler 1.直尺(测量距离) github:https://github.com/1149863 ...

  7. android标尺自定义view,android尺子的自定义view——RulerView详解

    项目中用到自定义尺子的样式: 原效果为 因为跟自己要使用的view稍有不同 所以做了一些修改,修改的注释都放在代码中了,特此记录一下. 首先是一个自定义View: public class RuleV ...

  8. picpick尺子像素大小精度不够准确_精度与分辨率是一回事吗

    我们所讲的精度通常是指它的精确度,其实这是错误的. 精度又叫做精密度,是跟准确度相对应的一个概念. 就像打靶一样,打的准,那就说它的准确度比较高: 而每两个靶之间能打出的偏移越小,那它的精密度就越高. ...

  9. 猿创征文|聊一聊我在字节跳动做项目质量改进的经验

    一.引言 那一年,我刚毕业一年多,在第一家公司依然到了成长瓶颈期,一是不愿意频繁出差(做乙方的无奈):二是疲于每天重复的手工测试(团队缺乏技术氛围),技术上难有突破的机会.身边的同事基本上是安于现状的 ...

最新文章

  1. golang 正则 校验 字符串
  2. GO 跟C++/C差异
  3. Python AdaBoost提升算法
  4. 计组-中央处理器小结
  5. echarts symbol 回调函数_【OpenLayer 实战】实现仿Echarts风格的动态迁徙图/航班图
  6. 插入排序 php,常用的排序算法(二)--插入排序(PHP实现)
  7. OpenCV绘制文字的代码及Mat/IplImage的转换
  8. 软件著作权登记申请时的60页源代码格式
  9. CCNA认证考试介绍
  10. vs 2017官网下载、QT下载
  11. Flash cs4 for mac 序列号
  12. Excel如何将汉字转成拼音
  13. 2021十个最佳linux发行版介绍
  14. Python大数据处理库 PySpark实战 总结四
  15. 科林明伦杯哈尔滨理工大学第六届程序设计团队赛(流水账)
  16. 在Delphi下使用迅雷APlayer组件进行免注册开发
  17. Python快速统计文件中高频词
  18. 2073:【例2.16 】三角形面积
  19. Android视频编辑器(三)给本地视频加水印和美颜滤镜
  20. 在python中、下列哪些说法是错误的-Python支持复数类型,以下哪个说法是错误的?...

热门文章

  1. [4G5G专题-15]:需求-5G网络架构内在的几大特征
  2. 高精度24bit 模数转化 AD7767芯片 使用总结
  3. 全面解析淘宝反作弊算法
  4. AntdIcon 动态图标使用方式
  5. react 从剪切板里粘贴图片并使用WEditor富文本展示
  6. 一个被挂上木马Trojan-Dropper.MSWord.Lafool.i的政府网站
  7. 使用Nginx转发TCP请求
  8. 年轻化设计及智慧科技领航 起亚汽车参展进博会
  9. opencv-python之图像的读取、显示与保存
  10. python手机壁纸超清_python下载高清壁纸