AR真实水平面生成与3D模型的水平面放置

背景


AR场景中需要对3D模型进行一个真实水平面的位置摆放,与摄像头拍摄的真实世界水平面类似,模型可任意的放置于这个水平面上。

于是存在几个问题
- 水平面怎么计算并生成?
- 计算出的水平面如何与模型所在AR的3D世界坐标对应起来?
- 如何保证把模型放置在了平面上,随着手机的任意移动和转向模型始终“面向观众”?
- 用户使用时的场景千奇百怪,就算用户已经摆放好模型到一个平面上,当他移动手机到一个新的环境重新去摆放,怎么保证还可以继续正确的放置到之前已经计算好的平面上?


水平面的计算

在3D世界中,平面可通过法向量和平面上的一个点来确定,我们通过借助手机的重力sensor实时的拿到手机的反重力向量,从而确定了平面的法向量,此时我们只需假定一个任意点则可生成任意个水平面。

 [_motionManager startDeviceMotionUpdatesToQueue:self.queue withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) {       
        /**
         *  gravity
         */
        CMAcceleration gravity = self.motionManager.deviceMotion.gravity;
        Ant3DIMUData* imuDataGravity = [Ant3DIMUData instanceWith:Ant3DIMU_MAGNETIC x:gravity.x y:gravity.y z:gravity.z time:[self getTimes]];
        [[NSNotificationCenter defaultCenter] postNotificationName:kAnt3DIMUDataNotification object:imuDataGravity];
    }];

水平面与模型所在的3D世界坐标对应

当我们已经计算出平面时,如何与3D世界的坐标系统一?我们知道当3D场景建立后,3D场景的世界坐标系便已经确定,对应到真实世界可以是任意方向和位置的, 我们所有的计算都需要基于这个世界坐标系去生成,所以我们只需要在世界坐标系建立的那一刻通过sensor计算出的旋转矩阵作用到相机节点便可以拿到3D世界中这个水平面的法向量,再通过规定任意一个点便确立了这个平面。

这里写图片描述


模型的水平面放置和“面向观众”

每当点击屏幕,模型都会摆放到点击点对应的这个平面上,这个过程可以抽象成通过相机视口发出了一条射线撞击这个平面,这不就是一个直线与平面的交点的问题吗?
如果直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z):

将直线方程写成参数方程形式,即有:

x=m1+v1t

                
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值