许多ARKit开发人员正在使用SceneKit作为其入门框架,这是一个很好的选择,主要是因为它可以访问iOS开发人员用于所有其他应用程序的所有本机功能。 使用SceneKit,您可以访问许多默认的几何类型,SCNBox,SCNSphere,SCNPyramid甚至SCNShape。 这些是很好的构建基块,但是当您要构建一些稍有不同的东西时,则必须更深入地自己构建几何。 我认为这是所有ARKit开发人员至少应该意识到的事情,这就是为什么我在之前的一些Medium帖子中展示了示例的原因,从我的第一个帖子开始: ARKit + SceneKit几何图形教程(第1部分) 在SceneKit中创建自己的几何形状,无需离开即可拥有各种场景和动画。 medium.com 大多数iOS开发人员不一定都具有3D几何或图形方面的背景知识,而且我认为他们不需要为了构建出色的东西而拥有背景知识! 因此,我最新的开放源代码框架用于创建基本为三角形的路径,这些路径可以围绕点集(SCNVector3的数组),如下面的GIF所示。 SCNGeomtry.path(path: positionArray) SCNPathNode(path: positionArray) 要创建一条从世界原点(或下面的1m)开始,向前然后向右的路径,您需要做的就是创建这样的类: 让pathNode = SCNPathNode(path:[ SCNVector3(0,-1,0), SCNVector3(0,-1,-1), SCNVector3(1,-1,-1) ]) 默认情况下,该路径的宽度为0.5m,它具有可以更改的其他属性,有关所有信息,请参见GitHub存储库: maxxfrazer / ARKit-SCNPath 仅使用点代表路径的中心为增强现实环境创建路径。 … github.com 好的,让我们来制作我在推文中展示的应用程序: 接下来,我们要添加点击手势。 当且仅当正方形未初始化(附加到屏幕)时,我才选择仅使用轻击手势来获取FocusSquare的当前位置,但是如果您希望执行的话,可以执行一次hitTest,用手指代替屏幕。 这些函数在ViewController中或在其扩展中。 var hitPoints = [SCNVector3]() func setupGestures(){ let tapGesture = UITapGestureRecognizer(target: self ,action: #selector (handleTap( _ :))) tapGesture.delegate = 自 自 .view.addGestureRecognizer(tapGesture) […]
苹果公司在房地产市场上的竞争 不适用WWDC,您可以在WWCS的所有广告中找到所需的信息,也可以在gentle中购买:AR套件! 一份由新书目许可的实用程序,可用于实际使用中的互感器。 在Xcode 9和iOS 11上运行Beta版本的功能,在AR套件中运行Beta版本的功能。 您可以下载免费的试用版dos dois软件,也可以下载没有链接的软件。 https://developer.apple.com/download/ 使用Xcode 9可以更安全地使用新的实用程序创建模板,并且可以使用以下示例代码: 您可以使用工具包中的SceneKit,SpriteKit或金属渲染器,也可以使用推荐的工具。 Nesse教程,SireKit实用工具。 模板实用程序可用于重要的配置: 艺术品 Essa pastaéo local onde devem ser colocados todos os arquivos de modelos 3D,cenas e texturas。 可以在模板上添加演示模板。 主板 故事板的负责人apresenta uma ViewController com uma ARSCNView octoando toda a tela。 Esse elementoéuma SceneKit视图在Realmentade Aumentada,许可使用图像的共同作用。 信息清单 Jáque utilizaremos acémeranesse aplicativo,许可列表j possui a propriedade隐私—相机使用说明configurada(通过esse模板通过ésétemdevéessa propriedade […]
我正在学习ARKit。 只是想我愿意分享我在其中一种练习或练习中遇到的情况。 我想做什么? 因此,关于我要完成的工作的一些背景信息。 从大图看,一旦应用启动,便已经存在一个3D白色块。 我想要做的是能够在任何平坦的表面上轻拍,并在该位置渲染或生成另一个盒子。 点击3D块,然后使该块消失。 所以,我有2个街区,对不对? 还有更多,随着我的探索。 这是逻辑代码 让我解释。 首先,我们进行一次命中测试。 如果有一个节点,或者我们实际点击了3D块,则返回该节点并将其从父节点中删除。 这摆脱了屏幕上的节点。 但是,如果我们未点击3D块,则进入if语句。 从第一条语句中,您可以看到我实际上是在尝试找出我所利用的是否是特征点(也称为平面)或Apple文档定义中的任何现实对象。 如果碰巧是一个功能点,我将调用addBox()方法。 这将添加另一个3D块。 运行该应用程序时会发生什么? 因此,我运行了该应用程序。 在平坦的表面上轻按,然后发生了什么,在该表面上渲染了一个块,但是原始块消失了。 不应该发生。 调试时间 因此,我想出如果我尝试使用常规的if-else语句,我会清楚地看到事情,因为我所做的只是一个警卫语句,只是Swift风格的另一个if语句。 所以我尝试了这个。 以不同的方式做同样的事情。 我运行了该应用程序,发生了同样的事情,这很奇怪。 两种代码都做同样的事情。 我检查了Apple的文档,并且非常确信它应该按照我认为的方式去做。 但事实并非如此。 因此,我认为我将检查代码的其他部分。 addBox()方法怎么样? 构建盒子和其他东西之后,这就是代码。 该代码的作用是每次调用addBox()时addBox()初始化一个新场景,并将该场景设置为视图的场景。 如果它每次都设置一个新场景,则意味着在调用该方法后,所有内容都将重置。 因此,每次我在平坦的表面上轻拍时,都会初始化一个新场景并添加一个块。 这可能就是为什么事情没有按计划进行的原因。 所以我将代码更改为此。 这是在现有视图的场景上添加一个块。 因此,它不会每次都重置,而只是添加一个块。 无论如何,这是我试图发表更清晰的技术文章。 希望你能理解。 谢谢阅读!
这是一篇非常简短的文章,解释了如何实现我创建的名为FocusNode的Pod。 实际上,这实际上与Apple在其ARKit演示中使用的类和代码完全相同,我只是拆分了该类并将其打包,以便可以轻松地在我的ARKit项目中包含和使用它,并认为其他人可能也希望这样做。 此Pod的存储库位于: maxxfrazer / ARKit-FocusNode FocusSquare`类直接取自Apple的ARKit示例,并打包为任何人都可以轻松使用。 … github.com 假设您已经设置了ARKit项目,请创建一个包含pod ‘FocusNode’ 。 整个过程应类似于以下内容: 项目“ PROJECT.xcodeproj” 平台:ios,“ 12.0” 目标“项目” use_frameworks! 吊舱 “ FocusNode” 结束 跳到ViewController.swift文件(在终端中运行pod install后创建的工作区中)并import FocusNode 。 完成之后,您应该可以访问新类FocusSquare ,这将创建一个具有基本方形UI的对象。 将其附加到场景图的rootNode,并将FocusSquare的委托设置为sceneView。 它看起来应该像这样: 让 focusNode = FocusSquare() 覆盖 func viewDidLoad(){ … … 自我 .focusNode.viewDelegate = sceneView sceneView.scene.rootNode.addChildNode( 自我 .focusNode) } 为了使其正常工作,您需要设置配置以检测水平和垂直平面。 为此,您的配置创建将看起来像这样,然后在会话上运行。 让配置= ARWorldTrackingConfiguration() configuration.planeDetection = [。 […]
增强现实(AR)允许用户体验现实世界中的虚拟对象。 苹果发布ARKit之后,为iOS构建AR应用程序变得很容易。 让我们考虑您要从源头到目的地旅行。 如果您可以看到一个在导航时显示方向的AR视图,而不是依靠2D应用程序,那将是多么令人兴奋。 可以使用带有ARKit的Google Maps SDK轻松构建此类应用程序,其中Google Direction Api在两个位置之间提供所需的方向信息。然后,这些方向信息用于在Google Maps和AR环境中绘制路线。 让我们看一下用于构建AR导航应用程序的框架。 2.1 Google Maps SDK Google Maps SDK会自动处理对Google Maps服务器的访问,地图显示以及对用户手势(例如单击和拖动)的响应。 它允许在地图上添加标记,折线,地面叠加层和信息窗口。 为了提出Google API请求,必须具有有效的API密钥。 2.2 ARKit ARKit框架允许开发高细节的增强现实体验。 在ARKit的帮助下开发的应用程序使用Visual Inertial Odometry(VIO)将虚拟对象放到了现实世界中。 在这里,ARKit框架用于开发实时导航应用程序,该应用程序通过将虚拟对象放置在增强现实场景中来显示从源到目的地的路径。 现在让我们跳入构建此应用程序必须实现的两个关键方面。 3.1。 在Google地图上的源和目标之间绘制路线。 Google Maps SDK支持在源位置和目标位置之间的地图上绘制概图折线。 源始终是用户的当前位置,该位置不可编辑。 用户只需提供其坐标即可选择任何目的地。 Google Directions Api会获取位置之间的路线。 它有助于根据区域搜索路线,指定不同的交通方式(驾驶,步行或骑自行车),不同的交通模式等。 确保您具有用于使用方向api的有效api密钥。 Google Direction URL: https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&mode= \(travelMode)&key = \(ApiKey) 以下示例以JSON格式请求从旧机场路到Indiranagar的步行路线: https://maps.googleapis.com/maps/api/directions/json?origin=12.96023760508684,77.6436832043738&destination=12.9718915,77.6411545&mode=”walking”&key=ApiKey 获得的JSON响应包含以下信息: status :此字段指示响应是否包含有效数据。 如果Api无法获取结果,则此字段提供有助于跟踪的调试信息。 […]
您可能听说过Sharknado,这是一部主题非常合理的电影-到处都是飞鲨。 在本文中,我们将尝试使用Xcode中的SceneKit编辑器来实现与ARKit类似的功能。 正如您将看到的,我们不需要大量代码即可完成从窗口传来的鲨鱼的效果,进行几次咬咬然后返回。 结果将类似于下面的视频。 实作 首先,创建一个名为ARAnimals的新的增强现实项目。 接下来,转到提供免费3D模型的网站TurboSquid.com,并选择这真棒的鲨鱼。 鲨鱼有几种格式,但是与Apple的SceneKit(我们用于在ARKit中渲染3D模型的版本)最兼容的是.dae格式或collada。 因此,将其解压缩,您将看到一个扩展名为.dae的文件,以及多个纹理图像。 将它们添加到Xcode项目中,选择.dae文件,将其重命名为sharks,然后在编辑器部分中按“转换为SceneKit场景文件格式”。 这会将collada文件转换为SceneKit文件。 导入后,您将看到以下结构。 在这里,我们不需要很多东西,例如图像平面和两个摄像头。 删除它们,创建一个父节点,然后将Armature和Parent_Sharkbody放在该父节点中,这将被称为shark。 产生的结构应类似于以下结构。 接下来,我们需要设置鲨鱼身体及其牙齿的纹理。 为此,选择Parent_Sharkbody节点,转到“材质”检查器,并将其“漫射”更改为图像Sharktexture002.png,该图像位于下载的3D模型的zip文件中。 这将使鲨鱼的身体有质感。 Parent_Sharkbody的子节点(称为Sharkjaw)包含鲨鱼的嘴巴。 同样,在“材质”检查器中,将“漫反射”更改为图像Sharkmouthtexture002.png。 这会给鲨鱼带来可怕的牙齿。 现在让我们设置鲨鱼的位置。 对于x和y,将0和z置于-5到-10之间。 这会使鲨鱼出现在您的面前。 由于鲨鱼已经在定向中,所以欧拉角钓鱼器的所有轴都应为0。 由于模型很大,因此将x,y和z的鲨鱼比例设置为0.5左右。 在运行应用程序之前,我们应该在ViewController中稍微修改Xcode生成的代码,以便加载场景。 这是在viewDidLoad方法中完成的,该方法将加载sharks.scn场景,而不是默认场景中的ship.scn。 现在,运行该应用程序,您应该会看到一条鲨鱼漂浮在您面前。 接下来,让鲨鱼来找我们攻击我们。 为此,我们将添加移动MoveBy动作,其中偏移量对于z轴为正。 由于鲨鱼已经处于负面位置,因此为了在我们面前看到它,正值会使其接近我们。 另外,当鲨鱼袭击我们时,我们会做出适当反应并让鲨鱼逃走。 为了做到这一点,我们将旋转鲨鱼并添加另一个MoveBy动作(现在为负值),这将产生鲨鱼要离开的效果。 可以像在“库”部分中添加任何其他元素,节点或粒子一样添加操作。 对于第一个移动动作,我们可以指定它在1秒钟后开始,持续5秒钟,并且其偏移仅在z轴上更改10米。 现在,我们需要使用RotateByEuler动作来旋转鲨鱼。 为了使鲨鱼转身,我们需要将其在y轴上旋转-180度。 可以在场景的第7秒完成此操作,此操作将持续一秒钟。 最后,我们需要采取相反的行动,将鲨鱼带回我们的面前,但现在又将其向后转。 运行该应用程序,您将看到鲨鱼降临。 到达后,等待一秒钟,旋转并离开。 为了使它更加有趣,请复制几次鲨鱼节点,然后更改x,y和z的值以及移动动作的持续时间和偏移量。 这将使场景更加恐怖,有许多鲨鱼向您袭来。 此外,当鲨鱼来到您的身上时,您可以添加一些粒子效果,例如可能意味着流血的红点(当然是鲨鱼的血液)。 如您所见,我们已经用最少的代码做到了这一点。 SceneKit编辑器非常强大,您无需编写代码即可完成许多有用的操作。 这个小项目的源代码可以在这里找到。
从ARKit的图片上,可以发现有三层的结构,分别是跟踪,场景理解,渲染 1.追踪 关于世界跟踪 ,这边想要提一下SLAM (同时定位和映射),也就是当iphone来到一个陌生环境时,能同步地,构造出与周遭环境,时间与空间的关系,可以从这篇文章知道更多。 ARKit即是利用VIO (Visual Inertial Odometry)的技术,来构建出虚拟物体与真实环境关系。 AR技术上,相较于google的Tango手机,iphone不需要额外的设备(广角镜头和红外线感测器),关于更多VIO技术,就要再跟google大神请教。 2.场景不足 World Tracking分析并理解,设备当前所处的空间周遭之讯息。 使用hit-Test的方法(见ARHitTestResult类),可以想像成成点击画面中的一个点,iphone发出射线,返回关于那个点在真实环境的资讯,找到相机画面的点,相对于真实世界的位置。 如果在ARWorldTrackingSessionConfiguration启用planeDetection中 ,ARKit会检测相机画面中的水平面,得到其位置与大小,我们就能把虚拟物体放在真实世界的平面上。 目前只有水平面的侦测 ,根据stackflow上的答案,有人在WWDC与Apple工程师对谈中发现, 垂直面的侦测是未来会增加功能。 Light Estimation (环境光预测),利用相机的感测,调整虚拟物体画面,整合虚拟物体在相机画面上,与真实世界划分,不会突出突出,不自然。 3.渲染 与官方的SDK SceneKit,SpiritKit,Metal整合,呈现3D或2D虚拟画面,还有与外部的Unity,虚幻引擎合作。 最佳做法和局限性 不清晰的场景,会降低AR体验,像是相机对着一面空白的墙,或者太暗的场景。 2.移动得太快或距离太远,也会降低AR体验。 3. planeDetection需要一点时间,一开始可能会检测到的不正确,一但发现完理想的水平面后,最好将planeDetection关掉,避免已设置好的虚拟物体又被更动。 关于了解AR,可以详见Apple提供的官方文件。
希望为希望利用iOS 11新型基于ARKit SLAM的世界跟踪器将SceneKit游戏扩展到Google Cardboard的用户提供一些快速模板代码。 主要组件是SLAMRunner,它在您和ARKit的ARSession之间进行中介。 第二个是一个简单的StereoViewController,它将您的SCScene附加到立体声“头节点”上。 可以根据自己的喜好调整摄像机的值,但普通用户对启动器的内在功能感到满意。 DualViewController.swift是一个示例类,它以100倍的喷射量实现了入门级XCode场景。 这是存储库: mikezucc / SimpleStereoARKit SimpleStereoARKit –关于在没有ARScene的情况下使用ARKit的简单参考指南,以及用于附加的简单便捷类…… github.com SLAMRunner.swift 裸露的简单对象即可运行基础ARKit SLAM。 这将以matrix_float4x4的形式向matrix_float4x4提供更新,该更新是matrix_float4x4的类型别名。 您可以使用诸如headNode?.simdTransform = transform这样的值来更新SCNode的位置。 像这样附加: tracker = SLAMRunner() tracker?.delegate = self 像这样接收更新: protocol SLAMRunnerDelegate { func updatedTransform(_ transform: matrix_float4x4, imagePixelBuffer: CVPixelBuffer) // plz lock up your buffers necessarily func trackingBadState(_ status: SLAMRunnerStatus, trackingState: ARCamera.TrackingState, error: Error?) } […]
上一个WWDC,iOS 12与ARKit 2一起发布。最初的ARKit于去年与iOS 11一起发布-它允许开发人员使用本机iOS框架将AR添加到其应用程序中,并使用户可以使用它。 借助ARKit 2,新的功能被添加到框架中,从而将体验带到了另一个层次。 诸如图像跟踪,世界地图,对象扫描, 视觉集成以及金属和反射表面之类的东西是其最新版本最令人期待的功能。 由于这只是第一部分,因此我将从图像跟踪开始,并随着我们的前进继续探讨其余所有主题。 这是集合的列表,随着我们的进行,它将更新: 影像追踪 世界地图 物体扫描 视觉整合(即将推出) 金属和反射性表面(即将推出) 就个人而言,图像跟踪是ARKit 2的最佳功能。 它允许开发人员将图像上传到他们的应用程序中,例如从相框中上传照片,然后可以在使用该应用程序时实时识别这些图片并在其上执行某些操作-例如在其顶部放置3D模型。 在WWDC的示例中,演示者使用了他的猫的相框。 他将图像作为ARReferenceImage上传到应用程序。 然后,您可以在应用程序中这样定义它: //定义一个变量来保存所有参考图像, 让 referenceImages = ARReferenceImage .referenceImages(inGroupNamed:“ AR Resources”,bundle:Bundle.main) 这将收集您放置在资产文件夹的AR资源文件夹中的所有参考图像。 接下来,我们必须配置我们的AR会话。 我们通过设置实例化ARImageTrackingConfiguration 。 除此之外,您还必须设置其trackingImages属性以及maximumNumberOfTrackedImages 属性。 第二个属性使应用程序知道该应用程序“允许”同时跟踪多少图像-通常取决于您打算对应用程序使用什么来决定。 这是一个例子: //创建会话配置 let配置= ARImageTrackingConfiguration () 配置 .trackingImages = referenceImages 配置 .maximumNumberOfTrackedImages = 1 //运行视图的会话 sceneView .session.run(configuration) 恭喜你! 您的应用程序现在将自动跟踪您告诉它的图像。 从那里开始,我们使用renderer( […]
如果您还没有,我强烈建议您阅读《 ARKit + SceneKit几何图形教程》(第1部分),其中有一些核心图形概念,您需要对其进行理解才能继续。 到目前为止,我已经向您展示了如何使用带有顶点,法线贴图和纹理贴图的原始类型重新创建SCNPlane和SCNBox的示例。 我接下来要讨论的是如何通过缩放,旋转或平移场景节点无法实现的方式使这些几何体生动起来。 这是本教程随附的GitHub存储库: maxxfrazer / SCNCustomGeometries-Part2 伴随我的中篇文章的第2部分。 通过创建以下内容,为maxxfrazer / SCNCustomGeometries-Part2开发做出贡献: github.com 我们要做的第一件事是获取多维数据集的单个顶点,并制作一个动画,使其看起来像是从多维数据集的中心拉开,然后随着其移回原位而产生摆动效果。 下面的GIF演示了动画: 单击此处在GitHub上查看此项目 这里的基本思想是,给定点[x,y,z]处的顶点,我想将其拉至[1.5x, 1.5y, 1.5y] ,然后将其释放回[x,y,z] 。 此处是随机选择顶点的,但是您可以添加hitTest来通过点击选择点。 当做这样的事情时,我发现使用图形计算器很有用,Desmos确实很棒,我已经使用了很多年了。 我建立了一个新类BoxStretcher ,它是SCNNode子类。 我还在SCNGeometry添加了另一个类函数,以返回具有8个顶点的标准多维数据集的顶点和索引。 我添加到BoxStretch的另一个有用函数是updateGeometry() ,它在给定更新后的顶点和索引的情况下创建SCNGeometry,并在顶点更新时重新分配节点的几何形状。 我发现为几何更新设置动画的最佳方法是使用SCNAction.customAction(duration:action :)。 无论您在代码块中放置什么,都称为每一帧,这是大多数动画所需要的。 这是animateCorner()的内容,它将在每次调用时更新顶点并刷新几何: 上面看起来有点复杂,所以让我们分解一下。 elapsedTime将是一个数字[0–3],因此在开始的0.5秒内,我们将通过if而不是else。 使用Desmos,我们可以看到它的图形如下所示(将时间交换为x): 因此,当elapsedTime达到0.5时,顶点应为[x,y,z] *(1 + 0.5),这将是我们想要的最远距离。 现在,当我们在0.5之后引入该部分时,如果将其分解,则为正弦波乘以指数衰减。 没有衰减,它将永远继续摆动,但是有了衰减,我们得到了顶点的良好运动,速度变慢并回到零。 当我们有零时,我们有:[x,y,z] *(1 + 0.0); 回到我们的起点。 这是指向我的Desmos图的链接,沿y轴有一个点,该点应遵循与顶点完全相同的模式。 拉伸释放 拉伸释放 拉伸释放www.desmos.com 对不起,如果我在那里失去你。 关键是我们希望该点沿[x,y,z]方向移动,但是自从我们开始以来基于时间多少? 我们需要一个函数,该函数需要花费时间并输出我们应该沿着曲线移动多少。 […]