微信公众号牌九棋牌开发ARKit初体验

微信公众号牌九棋牌开发(aqiulian.com)咨询更多ARKit联系QQ:212303635

1.1-写在前面的话

  • 初次接触ARKit,很多人会为其复杂的架构关系而感到畏惧。这里笔者将以最基础简介的方式带领一下一睹苹果原生AR(虚拟增强现实)的风采
  • ARKit并不是一个独立就能够运行的框架,而是必须要SceneKit一起用才可以,换一句话说,如果只有<ARKit>,而没有<SceneKit>,那么ARKit和一般的相机没有任何区别
  • 由于笔者从事多年的iOS应用开发,并没有从事过3D游戏的开发(只是业余爱好写了一个3D打飞机的游戏),所以在本篇介绍ARKit的过程中,我们将以最小的篇幅来介绍SceneKit,毕竟如果没有丰富的3D游戏开发经验,那么光是相机捕捉到的2D界面如果转化为3D世界的矩阵都非常难以理解
    • 关于3D系统X/Y/Z,与4x4矩阵等之间的转换及关系,不会过多深入,笔者将保证每一个不懂3D游戏开发的人都可以学习如何使用ARKit
    • 笔者认为:ARKit最难的部分在于3D坐标的矩阵转换
  • 笔者介绍ARKit的流程大概如下
    • 1.介绍ARKit的工作原理及流程(本篇)
    • 2.通过对ARKit的原理及流程的了解,我们自定义实现ARKit
    • 3.介绍ARKit框架中的所有API,PS:是翻译官方整个ARKit框架中所有的API………………~
    • 4.介绍ARKit框架中几个重量级的类ARScnView,ARSession,ARCamera
    • 5.ARKit实现捕捉现实世界中的平地,并将虚拟物体添加到平地中
    • 6.ARKit实现让虚拟物体跟随相机移动
      • 笔者没有单独的3D模型,这里主要以苹果官方给出的参考3D模型(飞机)来实现
    • 7.ARKit实现让虚拟物体围绕摄像机(拿着iPhone的人)旋转

1.2-ARKit与SceneKit的关系

  • 1.在上一小节中介绍过,AR技术叫做虚拟增强现实,也就是在相机捕捉到的现实世界的图像中显示一个虚拟的3D模型。这一过程可以分为两个步骤:

    • 一:相机捕捉现实世界图像

      • ARKit来实现
    • 二:在图像中显示虚拟3D模型
      • SceneKit来实现
  • 2.下图是一个<ARKit><SceneKit>框架关系图,通过下图可以看出
    • 继承:子类拥有父类所有的属性及方法
    • 1.<ARKit>框架中中显示3D虚拟增强现实的视图ARSCNView继承于<SceneKit>框架中的SCNView,而SCNView又继承于<UIKit>框架中的UIView
      • UIView的作用是将视图显示在iOS设备的window中,SCNView的作用是显示一个3D场景,ARScnView的作用也是显示一个3D场景,只不过这个3D场景是由摄像头捕捉到的现实世界图像构成的
    • 2.ARSCNView只是一个视图容器,它的作用是管理一个ARSession,笔者称之为AR会话。
      • ARSession的作用及原理将在本篇下一小节介绍
    • 3.在一个完整的虚拟增强现实体验中,<ARKit>框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由ARCamera负责捕捉摄像头画面,由ARSession负责搭建3D场景。
    • 4.在一个完整的虚拟增强现实体验中,将虚拟物体现实在3D场景中是由<SceneKit>框架来完成中:每一个虚拟的物体都是一个节点SCNNode,每一个节点构成了一个场景SCNScene,无数个场景构成了3D世界
    • 5.综上所述,ARKit捕捉3D现实世界使用的是自身的功能,这个功能是在iOS11新增的。而ARKit在3D现实场景中添加虚拟物体使用的是父类SCNView的功能,这个功能早在iOS8时就已经添加(SceneKit是iOS8新增)
      • 今后在介绍使用ARSCNView时将不再累述这一关系,可以简单的理解为:ARSCNView所有跟场景和虚拟物体相关的属性及方法都是自己父类SCNView

0301.png

1.3-ARKit工作原理

1.3.1-ARSCNView与ARSession

  • 1.ARKit提供两种虚拟增强现实视图,他们分别是3D效果的ARSCNView和2D效果的ARSKView(关于3D效果和2D效果区别以及在上一小节介绍),无论是使用哪一个视图都是用了相机图像作为背景视图(这里可以参考iOS自定义相机中的预览图层),而这一个相机的图像就是由<ARKit>框架中的相机类ARCamera来捕捉的。
  • 2.ARSCNViewARCamera两者之间并没有直接的关系,它们之间是通过AR会话,也就是ARKit框架中非常重量级的一个类ARSession来搭建沟通桥梁的
    • 在iOS框架中,凡是带session或者context后缀的,这种类一般自己不干活,作用一般都是两个:1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦 2.负责帮助我们管理复杂环境下的内存

      • context与session不同之处是:一般与硬件打交道,例如摄像头捕捉ARSession,网卡的调用NSURLSession等使用的都是session后缀。没有硬件参与,一般用context,如绘图上下文,自定义转场上下文等
  • 3.要想运行一个ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration,ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大
    • ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型

0302.png

1.3.2-ARWorldTrackingSessionConfiguration与ARFrame

  • 1.ARSession搭建沟通桥梁的参与者主要有两个ARWorldTrackingSessionConfigurationARFrame
  • 2.ARWorldTrackingSessionConfiguration(会话追踪配置)的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部实现了一系列非常庞大的算法计算以及调用了你的iPhone必要的传感器来检测手机的移动及旋转甚至是翻滚
    • 我们无需关心内部实现,ARKit框架帮助我们封装的非常完美,只需调用一两个属性即可
  • 3.当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理(与前面说的session管理内存相呼应),而相机的位置数据对应的类就是ARFrame
    • ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象
  • 4.ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它觉得了我们看物体的视野
  • 它们三者之间的关系看起来如下图:

0303.png

  • ARCamera在3D世界的位置看起来是这样的

0304.png

1.4-ARKit工作完整流程

  • ARKit框架工作流程可以参考下图:

    • 1.ARSCNView加载场景SCNScene
    • 2.SCNScene启动相机ARCamera开始捕捉场景
    • 3.捕捉场景后ARSCNView开始将场景数据交给Session
    • 4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
    • 5.给ARSCNView的scene添加一个子节点(3D物体模型)
      • ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置

        • 在3D坐标系统中,有一个世界坐标系和一个本地坐标系。类似于UIView的Frame和Bounds的区别,这种坐标之间的转换可以说是ARKit中最难的部分

原文地址:https://www.cnblogs.com/yssa/p/8444014.html

时间: 2024-08-25 02:23:23

微信公众号牌九棋牌开发ARKit初体验的相关文章

微信公众号的运营与开发

今天自己学习微信公众号的运营和开发,首先要运营和开发公众号肯定是要先申请一个微信的公众号. 在这里我申请了一个个人的订阅号:首先你可以进入微信公众号的官网,会显示提醒你注册或者是登录,然后就可以按照提示信息进行步骤注册,然后登录到你申请的公共号的后台.也就是可以以运营者的身份运营自己的微信公众号了. 就可以看到下面微信公众号的后台管理页面了: 然后就可以对公众好进行管理了. 今天主要是讲怎样接入微信公众号的API进行开发的. 第一步:要将自动回复功能停用,可以在基本配置的地方启用服务器配置,如下

微信公众号开发之js-sdk开发

公司最近项目需要使用微信进行分享,对微信的jssdk研究了下,由于研究过程并不顺利,遇到的坑比较多,所以特意将研究结果记录下来,供大家批评和参考! 官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 微信的jssdk是面向网页开发者提供的基于微信内的网页开发工具包,提供了诸如分享朋友圈,分享微信好友,分享QQ好友 and so on,具体支持的文档参考上述官方文档; 在进行微信jssdk开发之前,首先你得拥

微信公众号项目总结--加快开发速度和调试效率

近端时间接手了某上市公司的内部员工分享系统的微信端项目,由于接手后去理解整个项目的架构.规范等的时间紧迫,所以导致开发期间遇到较多问题从而加班加到心力交瘁.现在项目大概算完成了一个里程碑,所以在这里总结一下项目中所获得的东西,所踩过的坑,好让下一次开发更具效率. 前端本地模拟微信登录 由于微信公众号要使用微信jssdk api,api的使用需要微信授权.登录.获取token等一系列操作,如果是本地调试的话可以通过url的判断进行微信模拟登录.这样做的好处利于扩展,如果该产品不只使用于微信端的时候

个人微信公众号搭建Python实现 -开发配置和微信服务器转入-认识微信公众号(14.1.1)

目录 1.微信账号类型 2.微信公众号开发需求 3.微信公众号开发原理 @(认识微信公众号) 1.微信账号类型 个人号 公众号 订阅号 服务号 企业号 这里要讲的就是订阅号 前往注册微信公众号 2.微信公众号开发需求 内嵌功能 被动回复 主动告知 内嵌网页 高级需求需编程实现如 3.微信公众号开发原理 编程人员要做的就是完成开发者服务器或者说是网页服务器 前往微信公众号开发者文档 原文地址:https://www.cnblogs.com/simon-idea/p/11349388.html

微信公众号支付开发全过程 --JAVA

按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的,还配了图.我还要再说一遍. 用户点击一个支付按钮-->{后台一大推处理}-->用户看到了一个输入密码的界面,包含金额等一些信息-->用户输入密码后出来一个支付成功的页面(这部分流程都是微信自己完成的,我们什么都不用做)-->返回系统自己的页面(总不能让用户一直看着一个支付完成的页面吧

微信公众号开发教程[002]-配置

一.注册微信公众号 微信公众号官方入口https://mp.weixin.qq.com注册公众号,注册过程中,类型选择可能是新手比较迷惑的地方.微信公众号分为订阅号和服务号(还有个企业号,似乎用的人不多),每种类型下面又分为公司,政府部门,社会组织,个人等不同性质.不同类型,不同性质的公众号,权限不同,申请资料也不同. 例如:公司(订阅号或服务号),你得提供工商注册号,银行对账号.注册成功后,也并不是所有权限都默认开通,需要手动开通.有些权限还得微信认证之后才能开通.关于这些细节,可参阅微信公众

微信公众号开发教程[005]-消息管理-消息加解密

一.配置公众号消息加解密方式 在公众号官方管理后台->开发->基本配置->修改配置上有3种方式,如下: 其中,EncodingAESKey可以随机生成. 加解密方式说明: 1).明文模式:微信服务器向公众号服务器(即我们要处理的http://szuzsq.tunnel.qydev.com/weixin/index.php)发送的xml结构是原始的,没有加密.如下: <xml> <ToUserName><![CDATA[gh_733c42e0aee9]]>

做App还是微信公众号,你该如何抉择?

我不够聪明,因为我经常出于好奇被自己提出的问题所困扰,于是乎就有些强迫症似的拼命去寻求答案——我只是想说服自己,让自己从困扰的谜团中清醒.坚定方向,进而能从容不迫的走下去... 最近在考虑一个问题:做App还是微信公众号,应该以什么标准来做判断和抉择?——这源于:我之前所在的公司花了比较大的精力开发的一个跟我目前所在公司类似的移动端产品,貌似前几个月已经没怎么维护和运营了,把主要精力放在了其微信公众号上,各种活动和比较精心编辑的内容,看样子是想做成本地用户最多.最活跃的公众号,这种转变让我有些始

2014-07-24 .NET实现微信公众号的消息回复与自定义菜单

今天是在吾索实习的第12天.我们在这一天中,基本实现了微信公众号的消息回复与自定义菜单的创建. 首先,是实现消息回复,其关键点如下: 读取POST来的数据流:Stream 数据流变量 = HttpContext.Current.Request.InputStream,并把其存入数组:数据流变量.Read(数组变量, 0, (int)数据流变量.Length) 后,再转换为字符串:string 字符串变量 = Encoding.UTF8.GetString(数组变量) . 在数据流所转换成的字符串