iOS AR入门

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

2019-12-03  本文已影响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.自定义渲染

上一篇下一篇

猜你喜欢

热点阅读