ARKit 文档(6)-- ARSKView

一个通过将 SpriteKit 2D 内容显示在相机画面上,从而实现 AR 体验的视图。 使用 ARSKView 类可以创建一个将一个 2D 元素放置在相机中显示的真实世界的3D 空间中的增强现实体验。当你运行视图提供的 ARSession 对象时: 视图会自动渲染设备相机中的实时画面当做场景的背景。 当你实现 ARSKViewDelegate 中的方法去关联 Spritekit 内容与真实世界的位置信息时,视图会自动对这些 SpriteKit Nodes 进行缩放和旋转操作,来保证它们在现实世界中显示时候是永远朝向设备相机的。…

ARKit 文档(5)-- ARSCNView

一个通过将 SceneKit 3D 内容显示在相机画面上,从而实现 AR 体验的视图。 ARSCNView 类通过在现实显示世界的相机画面中渲染虚拟 3D 内容,提供一个非常简单的方式来创建增强现实体验。 当你运行 view 提供的 ARSession 对象时: 视图会自动渲染设备相机中的实时画面当做场景的背景。 SceneKit 场景视图的世界坐标系统是直接与 session configuration 管理的 AR 世界坐标系统响应的。 视图会自动移动他的 SceneKit 相机去匹配设备在真实世界中的移动。 由于 ARKit 会自动将SceneKit空间与真实世界相匹配,所以要放置一个虚拟物品让它显示在真实世界的位置上,只需要给它设置一个合适的 SceneKit 坐标即可。(更多请见 Providing 3D Virtual Content with SceneKit)。 你并不需要使用 ARAnchor 类去追踪你添加在场景中的物体的坐标,但是你还是需要实现 ARSCNViewDelegate 中的方法,这样你才可以在 ARKit…

ARKit 文档(4)-- 构建一个基础的 AR 体验

配置 ARSession,使用 SceneKit 或 SpriteKit 显示 AR 内容。 当你使用 ARSCNView 或者 ARSKView 类时,ARKit 会自动管理创一个 AR 体验最基本的要求:从相机中获取实时画面作为背景,并将你提供的 2D 或者 3D 图层内容渲染在上面,从而达到一个内容就是存在于现实世界中的错觉。根据你要实现的 AR 体验类型(2D 或 3D),选择一个视图类进行处理,并提供你要显示的内容所需要的位置和模型。 如果要创建一个你自己的显示视图作为替代,请见 Displaying an AR Experience with Metal。 配置并运行 AR Session 不管是 ARSCNView 还是 ARSKView 类,都包含了一个…

ARKit 文档(3)-- ARWorldTrackingSessionConfiguration

一个可以追踪设备方向和位置的配置,还可以检测现实世界在设备相机画面中的平面。 所有的 AR configuration 都建立了设备所处的现实世界与可建立AR模型的虚拟3D坐标空间的对应关系。当你的 APP 将虚拟内容和摄像头中出现的实时画面显示在一起时,用户就会产生一种虚拟内容就是存在于现实世界中的错觉。 创建并维护一个这样的对应关系需要追踪设备的运动。ARWorldTrackingSessionConfiguration 类可以在6个自由角度上(six degrees of freedom, 6DOF)追踪设备的移动, 也就是3个旋转轴(roll: 绕着垂直于手机屏幕的轴旋转,yaw: 绕着手机的向上方向旋转,pitch: 改变手机的俯仰), 3个平移轴(在 x, y, z 上的移动)。 这个水平的追踪可以创建一个身临其境的 AR 体验:不管用户是旋转设备从上下左右看,还是走到设备的前后左右面去看,这个虚拟物体都会像现实世界的一部分一样显示在同一个位置上。 如果设置了 planeDetection 参数,ARKit 会分析出真实世界场景中的平面,只要检测到平面,ARKit 就会自动的给 session 添加一个 ARPlaneAnchor。…

ARKit 文档(2)-- ARSessionConfiguration

一个只追踪设备方向的基础配置 所有的 AR configuration 都建立了设备所处的现实世界与可建立AR模型的虚拟3D坐标空间的对应关系。当你的 APP 将虚拟内容和摄像头中出现的实时画面显示在一起时,用户就会产生一种虚拟内容就是存在于现实世界中的错觉。 创建并维护一个这样的对应关系需要追踪设备的运动。ARSessionConfiguration 类在3个自由角度上(three degrees of freedom, 3DOF)追踪设备的移动, 也就是3个旋转轴(roll: 绕着垂直于手机屏幕的轴旋转,yaw: 绕着手机的向上方向旋转,pitch: 改变手机的俯仰)。 这是创建一个基本的 AR 体验所需的最基本的运动追踪水平:即使用户旋转设备去朝上看,朝下看,或者朝左右两边看,这个虚拟物体可以作为现实世界的一部分显示在现实世界中。然而,这个 configuration 无法追踪设备的移动:一些非同寻常的改变设备位置的操作会使得虚拟内容在现实世界中产生漂移,从而打破了 AR 的错觉。例如用户无法走到虚拟物体的背后去看它的背面。 虽然 ARSessionConfiguration 类只能创造有限的 AR 体验,但可以在任何支持 ARKit 的设备上使用。如果想在某些设备上提升更好的…

ARKit 文档(1)-- ARSession

一个单例,管理增强现实体验所需的设备相机和运动处理。 一个 ARSession 对象协调着你所维护的 ARKit 执行的主要进程,从而创造增强的现实体验。这些进程包括从设备的运动传感器中读取数据,控制设备的相机,对相机中捕获到的图像进行分析。session 会综合所有的结果去建立用户所在的现实世界与可建立AR模型的内容空间之间的联系。 每个用 ARKit 建立的 AR 体验都需要一个 ARSession 对象。如果你是使用 ARSCNView 或 ARSKView 来快速建立你 AR 体验中显示虚拟内容的部分。那么相应的视图对象已经拥有了一个 ARSession 实例。如果你是自己构造 AR 内容的渲染部分,那么你就需要实例化一个 ARSession 对象并维护它。 运行一个 session 需要一个 session configuration(一个ARSessionConfiguration 类的实例或它的子类ARWorldTrackingSessionConfiguration)。这些类决定了 ARKit 如何跟踪设备相对于现实世界的位置和运动,从而影响了你构造的 AR 体验的类别。…

ARKit 文档(0)-- ARKit原理及最佳实践

理解 ARKit 的概念,特性和创建优秀 AR 体验的最佳实践 满足一个 AR 体验的基本要求就是 创建 和 追踪 用户所在的现实世界 与 可建立模型的内容空间 之间的对应关系的能力,这也是 ARKit 所定义的特性。当你的 APP 将虚拟内容和摄像头中出现的实时画面显示在一起时,用户就会产生一种虚拟内容就是存在于现实世界中的错觉,这就是所谓的增强现实。 世界追踪技术的原理 为了创造一种在现实世界与虚拟空间之间的联系,ARKit 使用了一种叫做 visual-inertial odometry(视觉惯性测距) 的技术。它将会结合 iOS 设备的运动传感器和相机中对可见场景的计算机视觉分析进行处理。ARKit 会识别图像场景中显著的特征,并从视频帧中追踪这些特征的差异位置,最后与传感器数据进行比较,最后得到一个设备的位置和运动状态的高精度模型。 世界追踪技术 还会分析和理解场景中的内容。使用 hit-testing 方法(见 ARHitTestResult 类)寻找真实世界中与相机画面中的点对应的平面。如果你设置了…

Associated Objects 小记

在一个 viewController 的生命周期内,只执行一次某段代码,怎么做? 第一种方法是最常见也是最简单的方法,加标记位。 还有没有更优雅的办法呢?面向 Google 编程,得到这个答案: void (^excuteOnce)() = ^{ if (objc_getAssociatedObject(self, _cmd)) { return; } objc_setAssociatedObject(self, _cmd, @"Launched", OBJC_ASSOCIATION_RETAIN); // some code }; excuteOnce(); 什么是 Associated Objects ? OC 有一个最大的弊端就是,我们可以通过 Category 给一个现有的类添加属性,但不能添加实例变量。不过还好有 runtime,我们可以通过 Associated Objects 达到这一目的。 通过查看 <objc/runtime.…

记一个selectedBackgroundView的坑

今天在解 bug 的时候遇到了一个非常奇怪的问题,单击 cell 进行选中的时候,cell 中的一条用 UIView 实现的横线 seperateLineView 消失了。 看了一圈所有跟这个 seperateLineView 相关的代码,却看不出任何可能改动到包括 frame ,alpha ,hidden 的地方。这个时候就想起了关门打狗。 命名一个新的 UIView 的子视图 TestView : @interface TestView : UIView @end @implementation TestView - (void)setBackgroundColor:(UIColor *)backgroundColor { [super setBackgroundColor:backgroundColor]; // 在这里打上一个断点 NSLog(@"backgroundColor: %@", backgroundColor); } @end 接着操作之前的复现路径,发现在某次的断点中,backgroundColor 为 UIExtendedGrayColorSpace 0…

[译]用 Swift 协议扩展和泛型来实现复用

作为一个iOS开发者,最常用的任务就是通过自定义cell的子类,来实现UITableView或者UICollectionView的自定义。并且 UITableView 和 UICollectionView 在注册自定义cell子类这一块都有非常类似的API: public func registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String) public func registerNib(nib: UINib?, forCellWithReuseIdentifier identifier: String) 对于注册cell的自定义最常用的解决办法就是,声明一个reuseIdentifier的常量,像下面这样: private let reuseIdentifier = "BookCell" class BookListViewController: UIViewController, UICollectionViewDataSource { @IBOutlet private weak var collectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() let nib = UINib(nibName:…

我们来谈谈贝塞尔曲线

最近在做项目的时候,需要用到一个动画,非常简单的动画,简单到就是直接对一个View做平移... 然而虽然动画简单,但是却很不自然,尝试了UIView Animation提供的各类参数,都无法达到想要的动画效果。这时候,我的脑子里突然想起一个词... “贝塞尔曲线”.... 这个词经常看到,但却从没有去了解过,这次就趁着有求于它的雅兴,好好做个入门了解好了。 首先,什么是贝塞尔曲线? 显而易见的是,贝塞尔曲线,应该就是是一个叫贝塞尔的人发明的曲线吧,然而历史剧本却不是这么写的。贝塞尔曲线所依据的最原始的数学公式,是早在1912年就广为人知的伯恩斯坦多项式。OK,now,What is boensitan duoxiangshi?!简单来说,伯恩斯坦多项式可以用来证明,在[ a, b ] 区间上所有的连续函数都可以用多项式来逼近,并且收敛性很强,也就是一致收敛。再简单点,就是一个连续函数,你可以将它写成若干个伯恩斯坦多项式相加的形式,并且,随着 n→∞,这个多项式将一致收敛到原函数,这个就是伯恩斯坦斯的逼近性质。 不知道在说什么鬼?没关系,接着说.. 到了1959年,…

断点调试Autolayout

对于 iOS 和 OS X 开发者来说,Autolayout已经逐渐变成一个至关重要的开发工具。它让多屏幕适配变得小菜一碟(peasy),但是有些时候它还是会把我们搞疯掉,因为它总是会出现那些啰嗦又没啥用处的错误警告。 就像这样: Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2)…

Ghost博客折腾之旅

实习了刚好一个月了,可是回过头去却发现过去的那个月里似乎并没有留下什么。其实我知道,不是没有留下,而是没有记录。于是就萌生了写博客的念头。 工欲善其事,必先利其器。 第一篇博文就讲讲怎么样搭建一个自己的独立博客。 我使用的是DigitalOcean + Ubuntu 14.04 + Ghost 1.首先到DigitalOcean上申请一个VPS,5美元一个月的就够了。最好还是选择 San Francisco 节点,比较稳定,怎么申请不做赘述。 这里有个小福利,上 Github Education 申请一个student pack里面包含100美元的do的券。详情戳这里 2.申请完VPS就可以直接SSH了。 ssh root@ip地址 不出意外的话一般就能进得去。 然后记得passwd修改一下root密码,并且修改ssh端口,新建一个账号,禁用root账号等等。 进入了之后,首先安装NodeJS,依次执行下面命令 apt-get update apt-get install -y python-software-properties python…