zoukankan      html  css  js  c++  java
  • Unity中利用光线投射实现摄像机拉近追踪对象

    项目中要求实现摄像机跟踪人物移动,并且可以水平360°,上下接近180°的自由旋转。这些操作网上已近有很多版本的实现,在此不再赘述。我在此想说的是,当摄像机移动到场景边界,或者触碰到场景中的障碍物的时候,自动拉近与人物之间的距离,当人物再次走回场景中央的时候,逐渐恢复摄像机与人物之间的距离。

    我是通过unity里的光线投射来处理这个问题的。具体的实现代码如下:

        private GameObject targetObj = null;                //摄像机追踪的游戏对象
        private GameObject camera = null;                   //摄像机
        private RaycastHit hit;
        private string obstacleName = "Obstacle";           //障碍物的名字
        private int obstacleLayer = 0;                      //障碍物所在的Layer
        private Vector3 offPos = new Vector3(0, 1, 0);      //因为人物中心位于脚底,但是希望摄像机以人物要不为观察点,故有此值
        Quaternion rotation;                                //摄像机当前的旋转角度
        Vector3 position;                                   //摄像机当前的位置          
    
        void LateUpdate(int x)
        {
            if (null == targetObj || null == camera)
                return;
            rotation = new Quaternion();    //简写
            position = Vector3.zero;        //这里的position是当人物为触碰场景边界或者障碍物的时候,计算出的是相机的位置,需要计算,这里是简写.
            //下面对摄像机触碰到场景边界或者障碍物的情况做处理
            if (Physics.Linecast(targetObj.transform.position + offPos, position, out hit, 1 << obstacleLayer))
            {
                if (hit.transform.gameObject.name == obstacleName)
                {
                    position = hit.point;
                }
            }
            camera.transform.position = position;
            camera.transform.rotation = rotation;
        }
    View Code
  • 相关阅读:
    POJ 2259 Team Queue(队列)
    AcWing 129 火车进栈(模拟,dfs)
    AcWing 128 编辑器(对顶栈)
    AcWing 106 动态中位数(对顶堆)
    AcWing 124 数的进制转换 (高精度)
    AcWing 126 最大的和(贪心,前缀和,暴力ver.)
    【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
    「BZOJ 3209」花神的数论题
    「BZOJ 2142」礼物
    扩展卢卡斯定理(Exlucas)
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/7491852.html
Copyright © 2011-2022 走看看