美文网首页iOS AR入门
ARKit系统自带的几个常用的模型

ARKit系统自带的几个常用的模型

作者: 高阿呆 | 来源:发表于2019-12-03 18:28 被阅读0次

    ARKit系统自带的几个常用的模型

    首先要明确三维坐标系(苹果给的三维坐标系是横轴为X(右为正),竖轴为Y(上为正),指向左下角的为Z轴(左下为正)),如图:


    1967813-eb52042a3443a972.jpeg

    ①.创建scene

    ②创建一个模型(如下,十几种模型)

    ③创建一个节点,把模型添加到节点上

    ④确定节点的位置,X,Y为0,Z轴为负数(如上坐标系,若Z值为正,图像的显示会在屏幕前方.)

    ⑤把创建的节点添加到scene的根节点上

    ⑥sceneView的scene等于创建的scene

    1.新建一个项目,(上一节介绍过就不再赘述),直接上代码

    (1). SCNPlane平面
    
    // SCNPlane平面
    
    let scene = SCNScene.init()
    
    let scenePlane = SCNPlane.init(width:0.5, height:0.1)
    
    let planeNode = SCNNode.init(geometry: scenePlane)
    
    planeNode.position = SCNVector3.init(0,0,-0.3)
    
    scene.rootNode.addChildNode(planeNode)
    
    sceneView.scene = scene;
    
    (2). SCNBox正方体盒子
    
    // SCNBox正方体盒子
    
    let scene = SCNScene.init()
    
    let sceneBox = SCNBox.init(width:0.1, height:0.1, length:0.1, chamferRadius:0);
    
    let sceneNode = SCNNode.init(geometry: sceneBox)
    
    sceneNode.position = SCNVector3.init(-0.1,0,-0.2)
    
    scene.rootNode.addChildNode(sceneNode)
    
    sceneView.scene = scene;
    
    (3). SCNPyramid金字塔,角锥形
    
    // SCNPyramid金字塔,角锥形
    
    let scene = SCNScene.init()
    
    let sceneBox = SCNPyramid.init(width:0.1, height:0.1, length:0.1)
    
    let sceneNode = SCNNode.init(geometry: sceneBox)
    
    sceneNode.position = SCNVector3.init(0,0,-0.3)
    
    scene.rootNode.addChildNode(sceneNode)
    
    sceneView.scene = scene;
    
    (4) SCNSphere球形
    
    // SCNSphere球形
    
    let scene = SCNScene.init()
    
    let sceneSphere = SCNSphere.init(radius:0.1)
    
    let sphereNode = SCNNode.init(geometry: sceneSphere)
    
    sphereNode.position = SCNVector3.init(0,0,-0.2)
    
    scene.rootNode.addChildNode(sphereNode)
    
    sceneView.scene = scene
    
    (5). SCNCylinder圆柱形
    
    // SCNCylinder圆柱形
    
    let scene = SCNScene.init()
    
    let sceneCylinder = SCNCylinder.init(radius:0.1, height:0.5)
    
    letcylinderNode = SCNNode.init(geometry: sceneCylinder)
    
    cylinderNode.position =SCNVector3.init(0,0,-0.5)
    
    scene.rootNode.addChildNode(cylinderNode)
    
    sceneView.scene = scene
    
    (6). SCNCone圆锥(类似锥形的形状,也可以做成圆柱形)
    
    // SCNCone圆锥(类似锥形的形状,也可以做成圆柱形)
    
    let scene = SCNScene.init()
    
    let sceneCone = SCNCone.init(topRadius:0.05, bottomRadius:0.1, height:0.2)
    
    let coneNode = SCNNode.init(geometry: sceneCone)
    
    coneNode.position = SCNVector3.init(0,0,-0.3)
    
    scene.rootNode.addChildNode(coneNode)
    
    sceneView.scene = scene
    
    (7). SCNTube管状
    
    // SCNTube管状
    
    let scene = SCNScene.init()
    
    let sceneTube = SCNTube.init(innerRadius:0.02, outerRadius:0.05, height:0.1)
    
    let tubeNode = SCNNode.init(geometry: sceneTube)
    
    tubeNode.position = SCNVector3.init(0,0,-0.3)
    
    scene.rootNode.addChildNode(tubeNode)
    
    sceneView.scene = scene
    
    (8). SCNCapsule胶囊形状(第一个参数要比第二个参数要小)
    
    // SCNCapsule胶囊状(注意第一个参数一定要比第二个参数小)
    
    let scene = SCNScene.init()
    
    let sceneCapsule = SCNCapsule.init(capRadius:0.02, height:0.2)
    
    let capsuleNode = SCNNode.init(geometry: sceneCapsule)
    
    capsuleNode.position = SCNVector3.init(0,0,-0.2)
    
    scene.rootNode.addChildNode(capsuleNode)
    
    sceneView.scene = scene
    
    (9). SCNTorus圆环面(类似于游泳圈,中间空的,注意:第一个参数要比第二个参数大,第一个参数是圆的半径,第二个参数是内部空心圆的半径)
    
    // SCNTorus圆环面(注意:第一个参数要比第二个参数大,第一个参数是圆的半径,第二个参数是内部空心圆的半径)
    
    let scene = SCNScene.init()
    
    let sceneTorus = SCNTorus.init(ringRadius:0.05, pipeRadius:0.02)
    
    let torusNode = SCNNode.init(geometry: sceneTorus)
    
    torusNode.position = SCNVector3.init(0,0,-0.2)
    
    scene.rootNode.addChildNode(torusNode)
    
    sceneView.scene = scene
    
    (10). SCNFloor地板形
    
    // SCNFloor地板
    
    let scene = SCNScene.init()
    
    let sceneFloor = SCNFloor.init()
    
    sceneFloor.length = 0.1
    
    sceneFloor.width = 0.1
    
    letfloorNode = SCNNode.init(geometry: sceneFloor)
    
    floorNode.position = SCNVector3.init(-0.2,0,-0.5)
    
    scene.rootNode.addChildNode(floorNode)
    
    sceneView.scene = scene
    
    (11). SCNText显示一行字(距离一定要远,大概-100, extrusionDepth越大字体越粗)
    
    let scene = SCNScene.init()
    
    let sceneText = SCNText.init(string:"哈哈哈哈哈", extrusionDepth:0.1)
    
    let textNode = SCNNode.init(geometry: sceneText)
    
    textNode.position = SCNVector3.init(0,0,-80)
    
    scene.rootNode.addChildNode(textNode)
    
    sceneView.scene = scene
    
    (12). SCNShape用UIBezierPath类自定义形状
    
    let scene = SCNScene.init()
    
    let bezierPath = UIBezierPath.init(rect:CGRect.init(x:0.1, y:0.2, width:0.2, height:0.3))
    
    let sceneShape = SCNShape.init(path: bezierPath, extrusionDepth:0.1)
    
    let shapeNode = SCNNode.init(geometry: sceneShape)
    
    shapeNode.position = SCNVector3.init(0,0,-1)
    
    scene.rootNode.addChildNode(shapeNode)
    
    sceneView.scene = scene
    
    这里拿球形展示,展示效果如下:
    
    ![image](https://img.haomeiwen.com/i1967813/67bf25f5fed2605b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    这里会看到一个白白的球体.(大部分人都不喜欢白白净净的颜色,下来我们要给它添加选染色)
    
    SCNMaterial这个是系统给的渲染类
    
    //球形
    
    //创建scene
    
    let scene = SCNScene.init()
    
    //创建一个模型(radius:球体半径)
    
    let sceneSphere = SCNSphere.init(radius:0.1)
    
    //创建一个渲染器
    
    let sphereMaterial = SCNMaterial.init()
    
    // contents为任意类型的,可以是颜色,图片,视频
    
    sphereMaterial.diffuse.contents = UIColor.blue
    
    //把渲染给这个模型
    
    sceneSphere.materials = [sphereMaterial]
    
    //创建一个节点
    
    let sphereNode = SCNNode.init(geometry: sceneSphere)
    
    //节点的位置
    
    sphereNode.position = SCNVector3.init(0,0,-0.5)
    
    //添加到跟节点上
    
    scene.rootNode.addChildNode(sphereNode)
    
    sceneView.scene = scene
    

    这几个步骤缺一不可
    这里就可以看到一个带颜色的圆球

    image

    总结:

    ARKit是个移动AR平台

    支持A9以上设备(不支持模拟器)

    开发工具Xcode9以上iOS11以上系统

    移动设备:se 6s 6sp 7 7p 8 8p Xipad设备基本都能使用

    AR三大特性

    1.全局追踪

    2.视觉惯性测距

    3.没有外部设备

    场景理解

    1.平面检测(现实世界的理解)

    2.命中测试

    3.光估计(视觉效果更逼真)

    渲染

    1.简单集合

    2.AR视图

    3.自定义渲染

    相关文章

      网友评论

        本文标题:ARKit系统自带的几个常用的模型

        本文链接:https://www.haomeiwen.com/subject/lekhgctx.html