Tag: scenekit

ARKit和SceneKit入门

尽管增强现实技术已经存在了很多年,并且基于目标的体验的准确性不断提高,但是诸如PokémonGO等游戏的普及以及Apple发行的ARKit和Google的Android的AR Core的推出AR掌握在大多数消费者手中。 凭借能够了解您周围世界的无目标AR的能力,我们有机会打造出引人入胜的新AR体验。 随着新能力的出现,我们在创造这些体验的工作中将面临新的挑战。 在接下来的几篇文章中,我们将逐步建立各种流程,获取3D模型,对其进行处理并将其用于我们自己的AR体验中。 可以在https://github.com/AbovegroundDan/ARTutorial_Part1上找到此文章的项目。 基本 我们的ARKit应用程序将使用SceneKit进行渲染。 SceneKit是适用于iOS的本机3D渲染引擎,可直接与ARKit挂钩。 3D模型格式 SceneKit中有一些可用的本机格式可用于加载3D模型,但我们将专注于Collada Digital Asset Exchange或DAE格式。 DAE格式使我们可以在场景文件中包含多个对象,包括相机和灯光以及任何几何图形。 SceneKit具有用于加载场景文件的例程,我们将编写一些扩展程序以简化加载。 要编辑3D模型,我们将使用Blender,因为它是免费的并且可以满足我们的需求。 尺寸和单位 SceneKit使用仪表作为尺寸调整和物理模拟的度量单位。 因此,当我们看到任何涉及尺寸的内容时,包括Xcode中的“场景编辑器”,它始终是指米。 在Blender中,我们还需要确保以米为单位工作。 Blender的默认值是米单位,但是检查总比处理场景中的巨型或微小模型要安全得多。 在Blender的右侧面板中,选择“场景”选项卡,并确保将“单位”设置为“默认”或“仪表”。 坐标系 SceneKit在“ Y向上”系统中运行,这意味着Y轴朝上,而Blender的Z轴朝上。 在导出场景并将其加载到SceneKit时,我们需要意识到这一点。 通常这不是问题,因为出口商通常会负责转换。 根据您使用的是自定义导出器还是在不同的坐标系中工作,可能需要在建模应用程序内部旋转模型。 管道 从艺术家那里获得模型或自己完成所有工作时能够快速工作的秘诀是拥有良好的工作流程。 在这种情况下,我们需要一个良好的管道来以尽可能少的按摩和处理将模型带入我们的经验。 搅拌机加工和出口 我们首先要考虑的是我们是否要使用AR世界中文件中的模型来源。 在此示例中,我们将直接从3D模型文件创建AR场景,因此我们不会做太多更改。 确保稍后进行更简单的导入的一件事是确保文件路径是相对的,以便以后稍后导入或必须将文件传输到另一台计算机时,纹理的路径将继续指向有效文件。 归一化 我建议将每个模型的当前位置,旋转和比例标准化为基准值。 例如,如果在建模过程中将模式缩放为(0.87,0.92,0.87)以更好地适合场景,则应用该缩放将使当前缩放为(1.0,1.0,1.0),但将模型保持在该大小你有过。 这可能会干扰设置为特定值的动画,但是对于静态模型而言,它可以很好地工作,并且如果我们要设置比例或旋转值的动画,可以让我们在代码中进行某些假设。 为了规范当前值,我们必须使用Blender的Apply选项应用于对象。 通过单击场景层次面板旁边的+按钮,打开属性面板。 选择模型将向我们显示以下属性。 在这里我们可以看到对象具有旋转和比例。 我们将删除对象上的旋转,但将比例保持在它们所处的值(这是我们的美术师打算如何显示对象),但是我们要做的是将这些值设为默认值或身份值。 选择对象后,我们从底部菜单栏中选择“ 对象”->“应用”->“旋转和缩放”菜单项。 完成此操作后,我们可以看到旋转值分别为(0,0,0),缩放比例为(1.0,1.0,1.0),正是我们想要的值。 在这种特殊情况下,这些对象是单独的网格对象,我们现在要做的是将它们组合在一起,以便我们可以整体上操纵这些对象。 让我们创建一个父转换并将所有这些对象作为其子对象。 从3D视图底部的“添加”菜单中,选择“ 添加”->“空”->“平轴” 。 在“层次结构”视图中,将“ Empty”对象重命名为“ […]

Primeros Pasos con ARKit

十一月十一日在iOS 11上的发布会上,您将收到更多关于ARKit的信息。 iOS框架的清晰实现。 虚拟现实的存在于iOS上的存在,而虚拟现实的存在则在虚拟现实中得以实现,而在大多数情况下,这种行为就存在于新闻媒体中。 在iOS平台上,您可以通过视觉工具(VIO)组合视觉信息(VIO)。 ARKittienelacapacidaddereconocerlascaracterísticasmás著名的Lasimágenes,现实的侦探对比检测器的差异,在视频和视频的位置。 您可以在teoría的despuésde Toda laTeoría度假,也可以在墨西哥的tirarlíneasdecódigo度假。 ¿Cómoempezamos un proyecto de realidad aumentada? 在Xcode上的第9个版本,它们是“增强现实应用程序”。 不适用的常规技术:SpriteKit,SceneKit o Metal,电子游戏,电子游戏,3D场景摄影机等。 从苹果到苹果的视频聊天,从苹果到苹果的存在,从游戏到游戏,从头到尾都是真实的游戏Tener unos conocimientosbásicosy muchaimaginación。 实名制制的唱片(唱片,唱片,没有模拟唱片)在发行中。 您可以在ARKit上购买自己的产品和服务。 Para empezar,necesitamosañadirnuestro escenario,este caso和al trabajar con SceneKitseríaun objeto del tipo ARSCNView。 @IBOutlet var sceneView:ARSCNView! 在视图中将出现escena的配置。 ARWorldTrackingConfiguration以及您在escena上的新的配置文件中使用了Aquíestálomásbásicopara que funcione。 覆盖func viewWillAppear(_动画:Bool){super.viewWillAppear(animated)//创建会话配置let configuration = ARWorldTrackingConfiguration()//运行视图的sessionseneView.session.run(configuration)} 您可以在viewDidLoad中轻松地进行操作。 在3D显示器上显示3D图像。 覆盖func viewDidLoad(){super.viewDidLoad()//设置视图的委托sceneView.delegate = self //显示诸如fps和计时信息之类的统计信息sceneView.showsStatistics […]

使用SceneKit的基本3D游戏

场景套件 FrameworkนFrameworkที่เข้ามาช่วยสร้างเกม3Dงายขึ้นlyรื่องของ动画,物理,粒子和逼真的实体พูดง่ายคือSceneKitเปรียบเสมือน游戏引擎 Sceneารที่เราจะสร้างเกมเพื่อแสดงผลบนSceneKitViewนั้นก็เป็นเหมือนกับViewทั่วไปาก็สามาถลามนมButtonView,LabelViewื่อื่นๆดังตัวอย่าง Kitต่Kit Kit Kit Scene View D D D D D D D D D D D D D D D 3D Object ก่อน งากนั้นลองสร้างBoxเปล่าๆนขึ้า 2นได้ว่าเป็นกล่องขาวTextureรรมดาเราสามารมาTexture 2Dเข้ามาใส่ให้สวยๆารSetเข้าไปที่材质ได้ดังนี้ ใช้นิคการใช้场景 ใช้按住鼠标单击และลาและลายขวาหรือบนล่างมันจะหมุนไปรอบตัวเอตัวเงา向上/向下滚动มันจะเป็นการเลื่อนขึ้นลงแต่ถ้าเราอยาก放大/缩小ให้ทำการกดปุ่มOptionและ向上/向下滚动 **相机相机相机相机3D对象相机相机相机มันก็จะไม่เห็น 设置摄像机的位置ให้อยู่ตำแหน่ง0,0,0ก่อน งาง3D对象ถัดเข้าไปจะได้เห็นได้ชัดเจน 设置场景scene SceneKitView sceneView.scene = SCNScene(名称:“ FirstScene.scn”)! ก允许摄像机控制3ราขามารถเลื่อน3D Objectของเราได้บนมือถือแล้ว ผลลัพธ์

ARKit飞机,3D文本和命中检测

在本系列的第2部分中,我们通过提供一些交互性并更加熟悉SceneKit来构建我们的AR场景。 我们还查看了渲染相机,并使用它的位置(即用户在现实世界中的位置)在我们的球体对象中驱动动画。 在本文中,我们将开始检测水平面,并将对象附加到这些平面上。 可以在以下位置找到本教程的代码:https://github.com/AbovegroundDan/ARTutorial_Part3 检测飞机 ARKit通过didAdd / didUpdate / didRemove节点回调提供了完整的生命周期回调,以用于何时检测到平面,何时更新平面以及何时移除平面。 需要注意的一件事是,当首次检测到飞机时,它似乎跳了一点。 这是ARKit改进其所见所见的准确性,并调整锚点。 如果继续扫描地板,将继续看到特征点,但是平面不会增长或以任何方式变化以填充新发现的空间。 这是因为我们没有响应来自渲染器的didUpdate调用。 我们可以通过跟踪锚点和属于它们的平面来改善实现。 如果收到didUpdate回调,我们将查找锚点,找到飞机,并使用该锚点的新信息调整飞机。 跟踪飞机 为了跟踪飞机,我们将使用一个简单的字典将锚点映射到飞机。 这为我们提供了一种查找和修改相应平面的简便方法。 在我们的视图控制器中,我们将添加字典定义: 现在我们知道了曲面的位置,我们可以开始添加锚定到其上的项目。 而不是像第1部分和第2部分中那样使用外部3D模型,我们将使用一些3D文本。 让我们开始创建一个给定任意文本的方法,该方法将为我们提供一个具有3D文本几何形状的SCNNode。 接下来,我们将添加一个方法来将此父节点添加到另一个节点。 文字看起来不错,但是是浮动的。 这是因为文本容器的枢轴点位于实际文本所在位置的左下角。 枢轴点描述了对象的原点。 如果旋转对象,则将旋转点用作旋转对象时的中心点。 如果按比例缩放,也将从该点开始。 这可以用来创建一些有趣的效果。 现在,让我们尝试“接地”文本对象,以使它看起来像是坐在飞机上,而不是漂浮在飞机上。 在我们的createTextNode方法中,就在我们返回节点之前,添加以下代码: 现在运行代码将为我们提供假定位置的文本。 我们可以看到我们的文字在那儿投射了一些阴影,但是由于透明的网格,我们看不到它的阴影。 我们可以在SceneKit中做一些技巧来使阴影更好地显示。 我们将在此处使用这些技巧之一,并创建一个不会渲染的平面,但它将接受从其他对象投射的阴影。 在2017年WWDC SceneKit:新增功能(https://developer.apple.com/videos/play/wwdc2017/604/)会话中对此技术进行了说明。 让我们转到定向光定义并向其中添加以下几行: 仅此而已。 如果您在该GIF中注意到,我们将分散文本。 为此,让我们看一下将文本放置在我们点击的位置,而不是平面锚点的当前位置。 为此,我们将一个新参数传递给addText调用,并带有我们希望对象所在的位置。 我们将从SCNHitTestResult对象获得此位置,该对象从我们的点击命中测试返回。 修改didTapScreen调用以获取水龙头的位置,并将该信息传递给addText调用: 现在就这样。 收到了您接下来要看的内容的请求? 让我们在评论中知道! 不要忘记关注s23NYC:工程博客,其中发布了耐克的数字创新团队的很多精彩内容。 AbovegroundDan / ARTutorial_Part3 通过在GitHub上创建一个帐户来为AbovegroundDan / ARTutorial_Part3开发做出贡献。 […]

ARKit,SceneKit和如何控制世界

在本系列的第1部分中,我们经历了一个工作流程,在该工作流程中,我们处理了3D模型,使用Xcode创建了AR项目,开始了AR会话并将模型放入了增强场景。 在本文中,我们将开始使用各种SceneKit方法将模型付诸实践,并开始与我们世界中的对象进行交互。 可以在https://github.com/AbovegroundDan/ARTutorial_Part2上找到此文章的项目。 SceneKit提供了一组可应用于节点的操作。 这些动作可用于设置运动,旋转,缩放和其他节点属性的动画。 可以将它们分组以同时运行,按顺序依次运行,然后重复或颠倒。 完整列表可以在https://developer.apple.com/documentation/scenekit/scnaction中找到 我们将继续修改当前项目,并开始向我们的对象添加一些操作。 让我们从向球体添加旋转开始。 在HoverScene中的addSphere方法之后,添加以下方法: 让我们在球体上添加一些麻烦。 让我们也将其上下浮动。 我们将添加一个悬停动作,一个悬停动作,对这两个动作进行排序,然后将它们与我们现有的旋转动作组合在一起。 这是addAnimation方法的外观: 让我们为场景添加一些交互性。 让我们设定一个目标来开始场景,方法是让用户将球体放置在世界上,然后点按以激活它们。 由于我们的代码变得更加复杂,是时候开始抽象化处理场景对象的方式了。 在我们的项目中创建一个名为“对象”的新组。 在此文件夹中,我们将创建一个新的Swift文件,名为SceneObject.swift。 我们将创建一个派生自SCNNode的基类SceneObject。 我们一直在使用SceneKit做很多事情,但是仅了解ARKit可以做的一些事情。 作为快速了解更多ARKit功能的先导,让我们通过使球体“注视”相机为场景增添一点乐趣。 我们已经钩住了渲染器的updateAtTime方法,并且那里也有对相机的引用。 因此,让我们开始向Sphere类添加一个方法,以使其朝着特定方向发展。 球的“眼睛”已经面向负Z,这是对象的向前方向。 我们要做的是创建一个方法,该方法采用一个向量来标记我们的“眼睛”将要面对的空间中的一点。 请继续关注以获取更多ARKit乐趣! AbovegroundDan / ARTutorial_Part2 通过在GitHub上创建一个帐户来为ARTutorial_Part2开发做出贡献。 github.com

在SceneKit中更新SCNMaterial纹理

在iOS12和ARKit 2的最新发行版中,Fueled决定开发一款名为Toppler的多设备AR游戏,以探索其某些功能。 在构建这种AR体验时,我们需要向用户提供有关将要选择和抓取哪个块的反馈。 我们最终决定对材料纹理进行运行时更新是必须的。 但是,这样做时,我们遇到了在构建SceneKit游戏时其他人也可能遇到的问题。 交换纹理 我们有两个要用作纹理的不同图像,具体取决于块状态: 我将跳过UV贴图,该贴图负责在块上展开纹理,但是如果您想在此处获得更多详细信息,我之前已经写过有关如何将3D模型从Blender导出到SceneKit的信息。 我决定通过根据材料状态提供条件源来处理此问题。 以下是该TopplerBlockMaterial类的简化版本,该类是SCNMaterial子类,负责处理块的可视状态: 事实证明,底层流程花费了将近22%的允许时间来渲染框架和创建图像材料。 CoreGraphics需要在将UIImage应用于材质之前在新的缓冲区中重绘UIImage ,这被证明是非常耗时的。 我们绝对必须寻找其他地方来更新纹理,而又不影响游戏和AR体验,而这需要恒定的帧频。 偏移纹理 花了几个小时在文档中寻找解决方案之后,我终于在SCNMaterialProperty上发现了一个有趣的实例属性   : contentsTransform 。 事实证明,这正是我们所需要的。 这将允许我们创建一个包含两个不同状态的图像文件,然后我们可以偏移contentsTransform以仅显示纹理的所需部分。 这是新的纹理图像,红色矩形说明了可以用作contentsTransform的变换: 因此,我们需要使用两种不同的转换组合,一种用于普通,另一种用于突出显示状态。 这是使用此方法的更新后的TopplerBlockMaterial类: 我们遇到的这种阻止程序是一长串列表的一部分,当从UIKit发出来时,通常不会有人碰到它 。 交换UIImageView的UIImage是一个非常简单的过程,不应引入性能问题。 但是在使用3D环境和SceneKit时 ,我们会遇到一些使用UIKit时通常不会遇到的意外的性能考虑。 希望本文也能对其他人有所帮助。

着色器的ARKit + SceneKit简介

之前我谈到过如何在SceneKit中创建自己的自定义几何,结果您可以使用它们进行某些操作,例如偏斜或动画。 请参阅此处的第2部分的第1部分: ARKit + SceneKit几何图形教程(第1部分) 在SceneKit中创建自己的几何形状,无需离开即可拥有各种场景和动画。 medium.com 在该系列的第二篇文章的结尾处,我展示了如何使用看起来像字符串的标志来设置标志的动画,这是在SceneKit中向几何体或材质添加着色器的一种方法。 在许多情况下,比起我所展示的其他示例,诸如我上一篇文章底部所示的着色器是使几何图形动画化的更好选择。 主要原因是这些功能由SceneKit接受,编译为Metal,然后在设备的GPU上运行,该GPU比要在其他地方运行的CPU强大得多。 这主要是因为GPU是专门为处理图形而构建的(因此,其名称为Gphphics Processing U nit),所以我们希望尽可能多地使用它! 我想在本文中提到的应用着色器的方法主要是通过使用SCNGeometry对象的shaderModifiers属性。 首先,请看这里: SCNShadable – SceneKit | Apple开发人员文档 着色器修改器是Metal着色器语言或OpenGL着色器语言(GLSL)中的源代码片段,可用于… developer.apple.com 作为一个简单的示例,请看以下小片段: 如果(_geometry.position.y> 0){ _geometry.position.x + = 0.5; } 假设我们将其应用于尺寸为SCNBox类型的几何。 _geometry代表顶点,正如我之前的文章中所述,其位置当然是其在3D空间[x, y, z] 。 在此代码段中,我们获取位置在立方体中心上方的所有顶点,并将其向x方向正方向的侧面推0.5m。 我们可以迅速使它变得更有趣,而无需考虑太多,例如: 如果(_geometry.position.y> 0){ _geometry.position.x + = 0.5 * sin(u_time); } u_time是SceneKit开始渲染此着色器以来的时间(以秒为单位)。 因此,这将在正弦缓和之后以平滑的方式将立方体的局部x轴上+0.5的这4个点动画化为-0.5。 最后,我将演示的多维数据集示例是使用单位圆方程将前四个点从沿直线移动更改为沿圆移动。 单击此处以查看Desmos的快速图表,以防万一您不确定该如何组合。 如果(_geometry.position.y> 0.0){ _geometry.position.xz + […]

ARKit Pods — SCNPath

许多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) […]

ARKit Pods — FocusNode

这是一篇非常简短的文章,解释了如何实现我创建的名为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 = [。 […]

SceneKit和基于物理的渲染

在本文中,我将指导您使用SceneKit及其基于物理的渲染功能创建场景。 SceneKit是我最喜欢的Apple框架之一。 什么是SceneKit? 让我们从开发人员苹果网站查看定义: SceneKit将高性能渲染引擎与描述性API结合在一起,用于导入,操作和渲染3D资源。 与要求您精确实现显示场景的渲染算法的低级API(例如Metal和OpenGL)不同,SceneKit仅需要描述场景的内容以及想要执行的动作或动画。 从定义中可以看到,其中包含很多内容。 基本上,通过使用SceneKit,您将能够创建游戏和其他3D应用程序,而无需了解任何计算机图形算法,物理模拟等。 您基本上用对象和功能来描述场景,Apple会为您做一切。 在计算机图形学方面,关于SceneKit的最有趣的事情之一是在2016年引入的:基于物理的渲染(PBR)。 我们已经在上一篇文章中了解了PBR的含义,因此您已经了解了PBR的理论基础知识(或者在未找到go的情况下进行检查😉)。 因此,这意味着SceneKit可以使用其自己的全新基于物理的渲染引擎来渲染基于物理的场景。 这值得么? 当然!! 😊 所以,让我们尝试一下! 在本文中,我们将从头开始创建一个场景,该场景使用您可以在SceneKit中找到的主要PBR功能。 在这篇文章的结尾,您将能够渲染下图中的场景。 现在该开始编码了!! 场景构建中使用的一般方法如下:对于每个主要场景类别组件,我们将创建一个类,该类封装相应SCNNode的创建,基本SceneKit单元元素及其设置,以获取所需的功能。 。 我们要创建的第一类是 包含我们需要设置灯光的基本特征的Light类:位置,旋转和通用颜色。 使用SCNLight类表示SceneKit中的SCNLight 。 类别Light { 让节点:SCNNode init(lightNode:SCNNode){ 节点= lightNode } init(lightFeatures:LightFeatures){ 节点= SCNNode() createLight() set(lightFeatures:lightFeatures) } func createLight(){ node.light = SCNLight() } 私人功能集(lightFeatures:LightFeatures){ node.light?.color = lightFeatures.color node.position = lightFeatures.position node.eulerAngles = lightFeatures.orientation; } […]