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
这几个步骤缺一不可
这里就可以看到一个带颜色的圆球
总结:
ARKit是个移动AR平台
支持A9以上设备(不支持模拟器)
开发工具Xcode9以上iOS11以上系统
移动设备:se 6s 6sp 7 7p 8 8p Xipad设备基本都能使用
1.全局追踪
2.视觉惯性测距
3.没有外部设备
场景理解
1.平面检测(现实世界的理解)
2.命中测试
3.光估计(视觉效果更逼真)
渲染
1.简单集合
2.AR视图
3.自定义渲染