ARKit__2_尺子项目
一、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_尺子项目相关推荐
- Android尺子项目
Android手机尺子项目 该项目就是让自己的手机屏幕变成一把尺子,看起来比较酷炫,而且可以很容易的进行测量.接下来看一下效果如何. 这个小项目其实没有什么特别的难度,关键是对于xml文件当中的tex ...
- Qt开发之画图画一把尺子入门案例项目分享
Qt开发之画图画一把尺子入门案例项目分享 之前就开发过此项目,一直没有上传源码给大家,今天给大家开发源代码,项目实现截图如下. 该项目是入门级项目对画图知识的使用,以及常用控件的使用,具备研究价值.没 ...
- MobileRuler项目(手机尺子)
下载了很多尺子软件,发现能够测量长距离的app不多,很多app只能测量小于手机屏幕尺寸的物体,这极大地限制了这类app的作用,如果让手机尺子能够移动测量物体,那么手机尺子的使用范围就会大很多.现在又一 ...
- iOS超全开源框架、项目和学习资料汇总(1)UI篇
上下拉刷新控件 **1. ** MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.(推荐) ...
- iOS超全开源框架、项目和学习资料汇总:UI篇
2017-01-30 iOS巍 CocoaChina 原文 上下拉刷新控件 1. MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉 ...
- android自定义尺子收集demo
demo合集: https://github.com/dalong982242260/AndroidRuler 1.直尺(测量距离) github:https://github.com/1149863 ...
- android标尺自定义view,android尺子的自定义view——RulerView详解
项目中用到自定义尺子的样式: 原效果为 因为跟自己要使用的view稍有不同 所以做了一些修改,修改的注释都放在代码中了,特此记录一下. 首先是一个自定义View: public class RuleV ...
- picpick尺子像素大小精度不够准确_精度与分辨率是一回事吗
我们所讲的精度通常是指它的精确度,其实这是错误的. 精度又叫做精密度,是跟准确度相对应的一个概念. 就像打靶一样,打的准,那就说它的准确度比较高: 而每两个靶之间能打出的偏移越小,那它的精密度就越高. ...
- 猿创征文|聊一聊我在字节跳动做项目质量改进的经验
一.引言 那一年,我刚毕业一年多,在第一家公司依然到了成长瓶颈期,一是不愿意频繁出差(做乙方的无奈):二是疲于每天重复的手工测试(团队缺乏技术氛围),技术上难有突破的机会.身边的同事基本上是安于现状的 ...
最新文章
- golang 正则 校验 字符串
- GO 跟C++/C差异
- Python AdaBoost提升算法
- 计组-中央处理器小结
- echarts symbol 回调函数_【OpenLayer 实战】实现仿Echarts风格的动态迁徙图/航班图
- 插入排序 php,常用的排序算法(二)--插入排序(PHP实现)
- OpenCV绘制文字的代码及Mat/IplImage的转换
- 软件著作权登记申请时的60页源代码格式
- CCNA认证考试介绍
- vs 2017官网下载、QT下载
- Flash cs4 for mac 序列号
- Excel如何将汉字转成拼音
- 2021十个最佳linux发行版介绍
- Python大数据处理库 PySpark实战 总结四
- 科林明伦杯哈尔滨理工大学第六届程序设计团队赛(流水账)
- 在Delphi下使用迅雷APlayer组件进行免注册开发
- Python快速统计文件中高频词
- 2073:【例2.16 】三角形面积
- Android视频编辑器(三)给本地视频加水印和美颜滤镜
- 在python中、下列哪些说法是错误的-Python支持复数类型,以下哪个说法是错误的?...