博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ARKit]8-对裸眼3D效果一次不太成功的尝试
阅读量:7272 次
发布时间:2019-06-29

本文共 2427 字,大约阅读时间需要 8 分钟。

说明

The Parallax View

是个国外开发者开发的好玩的软件,它利用iPhoneX实现了裸眼3D的效果.

其实它是利用了iPhone X的ARKit面部追踪接口和TrueDepth传感器。
通过追踪用户的头部运动,确定眼睛在三维空间中的确切位置。
然后生成实时响应用户位置的影像,从而为用户带来一种3D影像的错觉。

原理特点

通过使用ARKit和iPhone X进行3D头部追踪来获得深度幻象。

为获得最佳效果,应该只打开一只眼睛(该应用允许选择要追踪的眼睛,或者可以尝试自动选择眼睛)

通过跟踪用户头部方向和位置,可以找到3D中的眼睛位置。

应用可以在该显示器上呈现从该位置看到的正确视图。

为了呈现该视图,使用离轴投影(非对称相机平截头体)。

这给人一种错觉,即物体出现在屏幕的前面和后面。

模仿

受此启发,我尝试在非iPhoneX设备上用人脸识别框架来实现低精度的裸眼3D效果. 原理是:

  • 利用人脸识别,检测人脸位置;
  • 将人脸的二维位置转换到3维空间中(z轴固定,xy按比例转换);
  • 将转换后的3D坐标赋值给摄像机;

原本打算,用识别出人脸的大小,做为依据来判断摄像机在z轴上的位置,但测试中发现,人脸识别出的大小变化很大,无规律可转换.

建立模型

自己用SceneKit的编辑器搭建了一个场景,里面有多根高度不同的柱子.

人脸识别

原来以为苹果的新框架Vision会更好,结果在我的iPhone SE上非常卡,而且Vision框架在识别人脸时对方向有要求,需要指定方向.所有最后还是使用了AVFoundation中的metadataObjectTypes来识别.

if session.canAddOutput(metaDataOutput) {       session.addOutput(metaDataOutput)} //7.AVFoundation框架识别类型metaDataOutput.metadataObjectTypes = [.face]复制代码

在代理方法中处理识别到的人脸:

//AV框架人脸识别func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {        for obj in metadataObjects {        if obj.type == .face {            print("face---\(obj.bounds)")            // 坐标转换            let oldRect = obj.bounds;            let w = oldRect.size.height * self.previewView.bounds.size.width;            let h = oldRect.size.width * self.previewView.bounds.size.height;            let x = oldRect.origin.y * self.previewView.bounds.size.width;            let y = oldRect.origin.x * self.previewView.bounds.size.height;                        // 添加矩形            rectLayer.frame = CGRect(x: x, y: y, width: w, height: h)            rectLayer.isHidden = false                        //凑出合理的数据            let cameraX = (oldRect.origin.y - 0.3) * 2            let cameraY = (0.4 - oldRect.origin.x) * 2            // 移动摄像机            self.cameraNode.position = SCNVector3(cameraX, cameraY, 20)                    }else {            rectLayer.isHidden = true        }    }}复制代码

效果初步有了:

但是我们还应该看到,我们的3D效果是通过直接移动摄像机的位置来实现,摄像机的视野范围并没有改变,所以看上去像是透过窗户看后面的景物,而不是像The Parallax View那样,3D物体像是与手机屏幕绑在一起.

最主要原因是:The Parallax View使用了离轴投影(非对称相机平截头体)处理摄像机看到的物体范围,如下图,不论如何移动,FOV(Field Of View)都始终对齐了底座的四个角:

投影变换

在SceneKit中,是可以给camera设置自定义的投影变换矩阵的 self.cameraNode.camera?.projectionTransform

苹果也给出了说明,一旦设置该项,则对摄像机设置的 zFar,zNear, 和fieldOfView都会失效,原因是这些值无法从矩阵中得到(数学上不可逆). 另外需要注意的是:ARKit中的ARSCNView类会重写这个投影变换,所以不要在AR应用中修改.

如果有深厚的3D数学功底,只要重写这个投影变换矩阵,就可以得到离轴投影效果,可惜我现在不会,相关配置还需要研究,以后更新.

代码

代码地址

转载地址:http://edicm.baihongyu.com/

你可能感兴趣的文章
spring boot + jta + druid整合demo
查看>>
OpenERP7.0中日期无效的问题
查看>>
centos 7 mysql 安装
查看>>
阿里与菜鸟:“计划”思维能否指挥“市场”物流
查看>>
Spring 4.3 的新功能和增强
查看>>
HTML5应用程序缓存Application Cache详解
查看>>
python写的获取一天从这一年开始的开数
查看>>
Android开发之使一打开activity等界面Edittext获取焦点,弹出软键盘java代码实现
查看>>
我的友情链接
查看>>
异步发邮件
查看>>
App自动化测试工具总结
查看>>
Vlookup反向查询
查看>>
CentOS下安装cronolog拆分tomcat日志文件catalina.out
查看>>
什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
查看>>
MoonWarriors(月亮战神)源代码下载
查看>>
读书笔记之《Java并发编程的艺术》-并发编程基础
查看>>
某次数据迁移简记
查看>>
以实际产品为例, 进行软件工程训练的作业
查看>>
万网居国内域名榜首 中国数据首超35互联排名第二
查看>>
wxWidgets的链接
查看>>