ARKit__2_尺子项目

Stella981
• 阅读 610

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

先看效果,如下图:

ARKit__2_尺子项目

  • 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 = color
        let 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 = worldPosition
              currentLine = Line.init(sceneView: self.sceneView, startVector: vectorStart, unit: self.unit)
            //设置结束的节点
            vectorEnd = worldPosition
            currentLine?.update(to: vectorEnd)
            infoLabel.text = currentLine?.distance(to: vectorEnd) ?? "是同一个点"    
        }
    }

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

三、总结一下思路

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

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

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

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Google开源GSON的使用
\谷歌开原项目GitHub地址:https://github.com/google/gson1.新建一个maven项目,引入gson的dependency坐标依赖以及commonsio的坐标:<!处理json格式数据<dependency<groupIdcom.g
Stella981 Stella981
3年前
ActiViz(VTK的C#库)学习使用心得之九:三维坐标轴的实现
    三维程序设计中,通常会在控件窗口中设置和显示坐标轴系线,方便操作和使用。VTY库中提供vtkAxesActor类,方便用户快捷实现三维坐标的实现。效果如下:!(https://oscimg.oschina.net/oscnet/74ce39b3acd40fca584e7d0df565693d3ef.jpg)    C核心代
Stella981 Stella981
3年前
IDEA+Maven搭建JavaWeb项目
首先新建一个maven项目,不选择任何模板!(https://oscimg.oschina.net/oscnet/2856ecc3c6830d41be1f7c3d8d953a8452e.png)然后填写项目坐标完成新建完成会得到一个标准的maven项目的目录!(https://oscimg.oschina.net/oscnet/ab9
Wesley13 Wesley13
3年前
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
1.几何变换的基本概念  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:1.原图像任意像素
Stella981 Stella981
3年前
CSS3 transform变形(3D转换)
一.三维坐标空间中三维坐标如下图所示:向上为Y,向下为Y,向左为X,向右为X,向前为Z,向后为Z。  !(https://img2018.cnblogs.com/blog/1541422/201901/1541422201901111634206041327443706.png)二.perspective(
Stella981 Stella981
3年前
OpenLayer4加载svg
关于加载svg的代码,网上是少之又少,牛老师博客倒是有,但是只是核心代码,并没有给出完整的demo,而且核心代码中有个问题对于这个ol渲染不太理解的话的话应该做不出来效果,就是关于坐标转屏幕坐标的问题,必须需要地图渲染完成之后才能拿到否则没法转换,得出转换为空的结果。放个图:!(https://oscimg.oschina.net/oscnet
Wesley13 Wesley13
3年前
80、54、84坐标系七参数转换算法
一、为什么要进行坐标转换  我们所在地球是一个不规则的椭球,地表凹凸不平,地底密度不均,因此很难用一个简单模型来概括。国际上根据建模坐标系的原点不同分为参心坐标系和地心坐标系,其中参心坐标系是指参考椭球的几何中心坐标基准,地心,通常分为:参心空间直角坐标系(以x,y,z为其坐标元素)和参心大地坐标系(以B,L,H为其坐标元素)
Stella981 Stella981
3年前
Maven的使用(依赖冲突)
1.1Maven坐标坐标:每一个jar包或maven项目在网络上都有一个独一无二的身份证坐标(GAV)1.groupId公司或组织域名的倒序(仓库:包名)2.artifactId项目名或模块名(仓库:项目名)3.version版本号(仓库:版本号)坐标和本地仓库有关系么?
暗箭伤人 暗箭伤人
1年前
【www.ithunter.club】 20230922下午
不容易的2023年,我们一起努力【www.ithunter.club】(2023092208:00:00.8872062023092216:00:00.887206)1.人事招聘专员数名(可选远程或入职)2.招聘向坐标东京Yahoo、Shift、L