02_ARKit阴影和遮罩

阴影(Shadow)

  在AR应用里,阴影扮演着一个非常重要的角色,通过阴影我们可以直观的感受到当前场景的光源位置、光线强弱、物体的轮廓等,通过将虚拟物体的阴影和现实世界的光照条件统一,我们可以获得更加真实的、符合视觉规律的增强现实体验。

如何在项目中创建阴影?

  1. 将主摄像头[Main Camera]设置为深感摄像头[Depth only]。
    Depth only

  2. 添加Unity AR Camera Manager脚本,并将主摄像头[Main Camera]拖拽入Camera项。
    添加Unity AR Camera Manager脚本

  3. 添加Hit Result Controller脚本,并将下载的AR模型拖入Obj项
    Hit Result Controller脚本
    脚本内容如下:

    	using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.XR.iOS;
    
    public class HitResultController : MonoBehaviour
    {
        //private Text text;
    
        public GameObject currentObj;
    
        public GameObject obj;
    
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Input.touchCount > 0)
            {
                var touch = Input.GetTouch(0);
                if(touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)
                {
                    Vector3 screenPos = Camera.main.ScreenToViewportPoint(touch.position);
                    ARPoint point = new ARPoint
                    {
                        x = screenPos.x,
                        y = screenPos.y,
                    };
                    ARHitTestResultType[] resultTypes =
                    {
                        ARHitTestResultType.ARHitTestResultTypeFeaturePoint,
                        ARHitTestResultType.ARHitTestResultTypeEstimatedHorizontalPlane,
                        ARHitTestResultType.ARHitTestResultTypeExistingPlane,
                        ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent,
                    };
    
                    foreach (ARHitTestResultType type in resultTypes)
                    {
                        List<ARHitTestResult> hitTestResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, type);
                        //text.text = hitTestResults[0].worldTransform.ToString();
                        if(currentObj == null)
                        {
                            currentObj = Instantiate(obj);
                        }
                        currentObj.transform.position = UnityARMatrixOps.GetPosition(hitTestResults[0].worldTransform);
                        //currentObj.transform.rotation = UnityARMatrixOps.GetRotation(hitTestResults[0].worldTransform);
                    }
    
                }
            }
        }
    }
    
    

    脚本内容大致为点击后在点击位置显示模型。
    模型下载链接:https://www.mixamo.com/

  4. 添加平面检测对象及添加Unity AR Generate Plane脚本,其中Plane Prefab项选择 shadowPlanePrefab
    添加平面检测对象

  5. 添加点云对象并进行相关配置
    添加点云对象

  6. 选择Build Settings并进行项目配置,run。

  7. 运行效果
    运行效果

  8. 阴影优化,点击[Directional Light],进行相关配置
    阴影优化_1
    打开Project Settings,选择Quality,进行相关配置
    阴影优化_2

  9. 重新编译运行。得到阴影优化过的效果。
    阴影优化效果

    可以看的阴影效果稍微暗淡一点(可以调整),但是显得更加真实。


总结:

  1、这里使用Unity内置阴影实现,优点是美观、效果好,缺点是性能消耗比较大。
  2、内置可以满足学习阶段的开发,在后续的项目实战中,将会采用一些插件来实现阴影,降低性能开销,并且基于环境理解实现动态阴影。

遮罩(Occlution)

  现阶段,大部分的AR技术都会遇到遮罩问题,主要体现在真实物体和虚拟对象的前后位置关系,如果不能实现巧妙的遮挡效果,这个问题将会
影响用户使用时的体验。

如何在项目中加入遮罩?
加入遮罩

在开发中,我测试的遮罩效果不太好,就不演示效果了。

# AR  ARKit 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×