理解苹果ARKit 1和2

DEMO 包含功能平面检测、环境纹理、物体操作(添加、选中、拖动、缩放、旋转)、图像识别、环境音效 什么是ARKit AR(Augmented Reality)运用计算机技术,将虚拟的信息应用到真实世界,被人类感官所感知。给人一种虚拟物体存在于现实世界的错觉。而ARKit整合运动传感器数据,相机数据,相机捕捉到的图像分析数据,用于建立现实场景和建模AR内容的虚拟场景的对应关系,为这种错觉提供数据基础,简化构建AR体验。 构建AR体验的三驾马车 Tracking 通过Tracking,我们可以: 获得相机在现实世界中的位置。 将相机图像和运动数据整合,形成AR视图。 追踪特征点,构建AR场景。追踪人脸,图像,物体等。 AR追踪的单位为m。因此在制作AR模型时,需要按照物体实际在现实世界中的屋里比例来制作。这样物体不至于过大或过小,呈现会更真实。 在iOS开发中,Tracking通过AVFoundation来获取场景图像,CoreMotion来获取运动数据。结合两者形成AR视图。 Tracking质量 要保证高质量的追踪Tracking数据,需要高质量的特征点。需要满足以下条件: 持续的相机数据和传感器数据 环境纹理要足够明显。需要处于一个光线充足并且纹理明显的环境当中,这样ARKit更容易提取特征点,建立空间对应关系。 静态场景。动态场景会导致视觉数据和运动数据不相符,影响追踪质量。...

我的代码习惯

我的代码习惯 一直以来我都坚持团队合作里面要有一份编码规范,尽量保持编码的一致性,让代码更清晰,便于代码审查和团队合作。即使迫于某些原因无法普遍的实施,但也要严格要求自己。 自己写的代码不仅仅是对项目,对自己负责,也要对他人负责。正常来讲在自己的写的东西在特定阶段会有其他人参与,也会被其他人接手,为了不被后来人骂的太惨,还是要保持良好的编码习惯。 代码规范 代码规范不是自己凭空想像的,主要还是参考了各家的代码规范,外加自己的实践。自己遵守的代码规范,主要参考Objc Zen Book。当时在火车上一口气看完,看完即决定就是它了。之前已有整理,详见《禅与Objective-C 编程艺术》笔记。接下来我再挑一些比较重要的来讲。 代码组织 分组 推荐使用属性。除了init和dealloc方法,应该总是使用.语法访问属性,如果getter方法里进行了初始化和其他操作,init方法里也应该使用.语法。 善于用#Pragma Mark进行代码分组。 私有方法添加p_前缀进行区分,但不要以下划线_开头。...

做一些改变

做一些改变 最近在思考工作这几年的成长,之前因为太懒很多东西都没有一个记录,导致再回顾的时候,大部分也就记不清了。其次现在每天获取的信息都太多太快,每一次的停留不过几分钟,长时间感觉自己都无法静下心来思考。 因此决定每个季度都能输出几篇文章,文章内容大部分还是对自己的一个记录,如果对大家有用,那就各取所需了。 之前总觉得很多东西别人已经写的很好了,自己再去写写只不过是一些二手文章。不过现在自己对此的观点有些变化。写博客对不同人来说意义可能不太一样,对于我来说首先是为自己所用,是一种适合自己对知识吸收,抒发感想的一种方式。管他的有用、无用、是否矫情,一切冷暖自知。如果自己写的东西能为别人所用,那自己也会产生助人为乐的喜悦感,当然我也希望能够多产生这种附加价值。当我们了解一个知识点,总会参考很多个方面,如果不去总结,时间久了,也就慢慢淡忘了,当再去了解时,又会重复之前的操作。如果能有一个记录,在之后有更深的了解时,可以不断的充实和修正。 成长就是不断的探索和回顾,从这篇文章开始,对过去说再见,开始一段新的旅程。

关于drawRect绘图重叠的问题

当我们在drawRect中绘图时,如果没有对当前view设置过背景色,或者未设置opaque属性值,会发现绘制的图形会重叠,这是因为drawRect默认不清除先前的内容。 drawRect清除操作取决于是否有填充操作; drawRect清除内容机制如下: context清理 UIView有个属性opaque, 默认为 YES。UIView 还有个属性clearsContextBeforeDrawing, 默认为 YES,官方文档解释如下: @property(nonatomic,getter=isOpaque)...

多线程-NSOperation,NSOperationQueue

NSOperation,NSOperationQueue demo。最快熟悉的方式就是自己码一遍。 NSOperation NSOperation是一个抽象类,我们可以直接使用其子类NSInvocationOperation和NSBlockOperation,或者封装NSOperation子类来添加要在线程中执行的操作。默认情况下NSOperation单独使用时执行同步操作。 NSInvocationOperation 操作在当前线程中执行,不开启新线程。 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(p_task1) object:nil]; [op1 start]; NSBlockOperation...