版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/82860534
本文是运动跟踪的实例,应该放在运动跟踪内,但现在插不进去了,就放这里吧。
我们已经对ARCore运动跟踪进行了深入的了解,对其原理、机制、局限性都有了比较深刻的认识,本节我们将结合ARCore的运动跟踪技术来展示其在空间的定位和跟踪能力。
在Google ARCore开发者演示中,有一款在空间绘画的应用叫ARCore Drawing,我们就来实现其核心的技术。
一、思路
我们的目标是实现用户利用手机在空间画线的功能(用户轨迹),主要利用ARCore对用户位置的空间跟踪能力。具体实现思路是:
- 建一个材质用于渲染线条。
- 随时间获取用户当前的位置,我们每隔1秒获取1次用户位置(手机设备)。
- 将获取到的位置保存起来,利用lineRender来画出位置点之间的连线。
二、实现步骤
创建材质
在Assets->Materials文件夹下新建材质LineRender,Shader选择Particles/Additive(选择其它Shader也是可以的),设置好Particle Texture,如图所示:
创建AppController
在Assets->Scripts文件夹下新建C# 脚本 Appcontroller(代码附后),在Hierarchy窗口中新建一个空对象,并为其添加Appcontroller脚本,设置脚本参数如下图:
实现代码
先设置lineRender相关参数,每隔1秒获取1次用户位置数据并将位置信息赋给lineRender,利用lineRender画线连接位置点,AppController代码沿用了之前我们写的代码结构,重复部分不赘述,关键代码如下:
public Material mMaterial;
public Camera FirstPersonCamera;
private LineRenderer lineRender;
private int PointCount = 0;
private bool mIsQuitting = false;
private float mDeltaTime = 1.0f;
private float mNextPointTime = 0.0f;
private int mMaxPoint = 100;
// Use this for initialization
void Start () {
OnCheckDevice();
lineRender = gameObject.AddComponent<LineRenderer>();
lineRender.material = mMaterial;
lineRender.startWidth = 0.005f;
lineRender.endWidth = 0.002f;
lineRender.startColor = Color.red;
lineRender.endColor = Color.yellow;
mNextPointTime = Time.time;
}
// Update is called once per frame
void Update () {
UpdateApplicationLifecycle();
if (Time.time > mNextPointTime && PointCount <= mMaxPoint)
{
AddLinePoint();
mNextPointTime += mDeltaTime;
}
}
void AddLinePoint()
{
lineRender.positionCount = PointCount + 1;
lineRender.SetPosition(PointCount, FirstPersonCamera.transform.position);
PointCount++;
}
以上代码实现了最基础,但也是最核心的空间运动跟踪及可视化的实现,对代码稍作扩展即可以实现空中手写、空中绘画、空中标点等功能。
编译运行,结果如下: