zoukankan      html  css  js  c++  java
  • AR判断识别图是否完全在扫描范围

    using UnityEngine;
    using UnityEngine.UI;
    
    public class AreaCheck : MonoBehaviour {
        //"AreaCheck"类名 ,需要和外部脚本名称保持一致
    
        public Material Green_Mate;
        //申请材质变量储存绿色的材质
        public Material Red_Mate;
        //申请材质变量储存红色材质
        public Material Tran_Mate;
        //申请材质变量储存透明材质
    
        private CanvasScaler CanS;
        //申请变脸储存UI屏幕自适度的缩放组件
    
        private float X_Sc;
        //申请浮点型类型的变量储存实际的缩放比例
    
        //记录扫描框的范围
        private Vector2 TopLeft_UI;
        //记录扫描框左上角的坐标
        //“private”申请类型为私有
        private Vector2 BottomLeft_UI;
        //记录扫描框左下角的坐标
        private Vector2 TopRight_UI;
        //记录扫描框右上角的坐标
        private Vector2 BottomRight_UI;
        //记录扫描框右下角的坐标
    
        //记录面片的世界坐标
        private Vector3 TopLeft_Pl_W;
        //记录面片左上角的世界坐标
        private Vector3 BottomLeft_Pl_W;
        //记录面片左下角的世界坐标
        private Vector3 TopRight_Pl_W;
        //记录面片右上角的世界坐标
        private Vector3 BottomRight_Pl_W;
        //记录面片右下角的世界坐标
    
        //记录面片的屏幕坐标
        private Vector2 TopLeft_Pl_Sc;
        //记录面片左上角的屏幕坐标
        private Vector2 BottomLeft_Pl_Sc;
        //记录面片坐下角的屏幕坐标
        private Vector2 TopRight_Pl_Sc;
        //记录面片右上角的屏幕坐标
        private Vector2 BottomRight_Pl_Sc;
        //记录面片右下角的屏幕坐标
    
        private Vector2 PlaneWH;
        //记录面片的宽高
    
    
        //脚本刚开始运行的时候调用一次
        // Use this for initialization
        void Start () {
            
            CanS = GameObject.Find ("Canvas").gameObject.GetComponent<CanvasScaler> ();
            //获取控制屏幕自适度的组件
    
            X_Sc = Screen.width / CanS.referenceResolution.x;
            //获取实际的缩放比例
        
        }
    
        //每一帧都调用
        // Update is called once per frame
        void Update () {
    
            //计算了扫描框四个点的坐标位置,“*X_Sc"是屏幕自适度的缩放比例,这样才能获取真正运行时UI图片的宽高
            //TopLeft_UI = new Vector2 (Screen.width-400*X_Sc,Screen.height+300*X_Sc)*0.5f;
            TopLeft_UI = new Vector2(0,1080 * X_Sc);
            //给扫描框左上角的坐标赋值
            //"Screen.width-400,Screen.height+300" 屏幕的宽度减去扫描框的宽度,屏幕的高度减去扫描框的高度
            //BottomLeft_UI =new Vector2(Screen.width-400*X_Sc,Screen.height-300*X_Sc)*0.5f;
            BottomLeft_UI = new Vector2(0, 0);
            //给扫描框左下角的坐标赋值
            //TopRight_UI =new Vector2(Screen.width+400*X_Sc,Screen.height+300*X_Sc)*0.5f;
            TopRight_UI = new Vector2(1920 * X_Sc, 1080 * X_Sc);
            //给扫描框右上角的坐标赋值
            //BottomRight_UI =new Vector2(Screen.width+400*X_Sc,Screen.height-300*X_Sc)*0.5f;
            BottomRight_UI = new Vector2(1920 * X_Sc, 0);
            //给扫描框右下角的坐标赋值
    
            PlaneWH = new Vector2 (gameObject.GetComponent<MeshFilter>().mesh.bounds.size.x,gameObject.GetComponent<MeshFilter>().mesh.bounds.size.z)*0.5f * 0.1f; //0.1f=ImageTarget.scale*PlaneInScreen.scale
            //获取面片的宽高的一半
            //"gameObject.GetComponent<MeshFilter>().mesh.bounds.size.x"获取面片X方向的宽度
            //"*5"是因为开始获取到的长宽是模型本身的长宽,而场景中我们有缩放因素,父级物体放大了50倍,自身缩小到了0.1,因此获取实际宽高需要再乘以5
    
            //获取面片四个点的世界坐标
            TopLeft_Pl_W = gameObject.transform.parent.position + new Vector3 (-PlaneWH.x,0,PlaneWH.y);
            //获取面片左上角的世界坐标
            //"gameObject.transform.parent.position"物体的父级物体的世界坐标
            //"new Vector2 (-PlaneWH.x,PlaneWH.y)"向左上方偏移的量
            BottomLeft_Pl_W = gameObject.transform.parent.position + new Vector3 (-PlaneWH.x,0,-PlaneWH.y);
            //获取面片左下角的世界坐标
            TopRight_Pl_W = gameObject.transform.parent.position + new Vector3 (PlaneWH.x,0,PlaneWH.y);
            //获取面片右上角的世界坐标
            BottomRight_Pl_W = gameObject.transform.parent.position + new Vector3 (PlaneWH.x,0,-PlaneWH.y);
            //获取面片右下角的世界坐标
    
    
            //获取面片的屏幕坐标
            TopLeft_Pl_Sc=Camera.main.WorldToScreenPoint(TopLeft_Pl_W);
            //获取面片左上角的屏幕坐标
            //Camera.main.WorldToScreenPoint(Vector3()); 将世界坐标转化为屏幕坐标
            BottomLeft_Pl_Sc=Camera.main.WorldToScreenPoint(BottomLeft_Pl_W );
            //获取面片左下角的屏幕坐标
            TopRight_Pl_Sc=Camera.main.WorldToScreenPoint(TopRight_Pl_W);
            //获取面片右上角的屏幕坐标
            BottomRight_Pl_Sc=Camera.main.WorldToScreenPoint(BottomRight_Pl_W );
            //获取面片右下角的屏幕坐标
    
            //判断面片是否在扫描框范围内
            if(TopLeft_Pl_Sc.x>TopLeft_UI.x&&TopLeft_Pl_Sc.y<TopLeft_UI.y&&BottomLeft_Pl_Sc.x>BottomLeft_UI.x&&BottomLeft_Pl_Sc.y>BottomLeft_UI.y&&TopRight_Pl_Sc.x<TopRight_UI.x&&TopRight_Pl_Sc.y<TopLeft_UI.y&&BottomRight_Pl_Sc.x<BottomRight_UI.x&&BottomRight_Pl_Sc.y>BottomRight_UI.y){
            //当面片完全处于扫描框范围内时 执行以下代码
                gameObject.GetComponent<Renderer>().material=Green_Mate;
                //将脚本所附着的物体(面片)的材质变为绿色材质
                
            }else{
            //当面片并非完全处于扫描框范围内时  执行以下代码
                gameObject.GetComponent<Renderer>().material=Red_Mate;
                //将脚本所附着的物体(面片)的材质变为红色材质
            }
        
        }
    }

    工程设置

  • 相关阅读:
    高精度乘除运算优化
    高精度除法
    高精度乘法
    期末考试
    P2341 [HAOI2006]受欢迎的牛[SCC缩点]
    P2002 消息扩散[SCC缩点]
    神奇搜索算法A*
    P3205 [HNOI2010]合唱队[区间dp]
    P4170 [CQOI2007]涂色
    P1220 关路灯[区间dp]
  • 原文地址:https://www.cnblogs.com/JimmyCode/p/7447471.html
Copyright © 2011-2022 走看看