2017-06-01 15:11:34 Mogoson 阅读数 2082
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从2018年开始虚拟现实、增强现实、混合现实(VR/AR/MR)技术已经被国家正式列入重点发展产业目录。 由中国通信工业协会协同地方政府主办,国内各大企业与高校积极参与的《世界VR产业大会暨第某届中国国际通信电子产业博览会》每年都会大约10月中旬在南昌市举办, 所以未来的数年将是虚拟现实技术大发展的时期。              本教学视频课程从企业真实虚拟现实项目中提取核心技术要点,总结必须开发功能要素,全面而细致的讲解虚拟现实之汽车模拟仿真项目中需要开发的各个功能模块、开发要点等。 本作从项目环境搭建、汽车零部件素材导入、 汽车零部件模拟拆卸、主摄像机旋转与缩进控制、部件灵活运转算法、部件颜色喷漆、汽车模拟导航、多摄像机镜头处理、项目整体音频音量控制、项目UI设计等方面,给出详细的解决方案。              本课程的细致学习将有助于虚拟现实企业高薪就业与优秀VR项目的高水平研发之目的。 一、热更新系列(技术含量:中高级): A:《lua热更新技术中级篇》 https://edu.csdn.net/course/detail/27087 B:《热更新框架设计之Xlua基础视频课程》 https://edu.csdn.net/course/detail/27110 C:《热更新框架设计之热更流程与热补丁技术》 https://edu.csdn.net/course/detail/27118 D:《热更新框架设计之客户端热更框架(上)》 https://edu.csdn.net/course/detail/27132 E:《热更新框架设计之客户端热更框架(中)》 https://edu.csdn.net/course/detail/27135 F:《热更新框架设计之客户端热更框架(下)》 https://edu.csdn.net/course/detail/27136 二:框架设计系列(技术含量:中级):  A:《游戏UI界面框架设计系列视频课程》 https://edu.csdn.net/course/detail/27142 B:《Unity客户端框架设计PureMVC篇视频课程(上)》 https://edu.csdn.net/course/detail/27172 C:《Unity客户端框架设计PureMVC篇视频课程(下)》 https://edu.csdn.net/course/detail/27173 D:《AssetBundle框架设计_框架篇视频课程》 https://edu.csdn.net/course/detail/27169 三、Unity脚本从入门到精通(技术含量:初级) A:《C# For Unity系列之入门篇》 https://edu.csdn.net/course/detail/4560 B:《C# For Unity系列之基础篇》 https://edu.csdn.net/course/detail/4595 C: 《C# For Unity系列之中级篇》 https://edu.csdn.net/course/detail/24422 D:《C# For Unity系列之进阶篇》 https://edu.csdn.net/course/detail/24465 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级) A:《虚拟现实之汽车仿真模拟系统 》 https://edu.csdn.net/course/detail/26618 五、Unity基础课程系列(技术含量:初级)  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》   https://edu.csdn.net/course/detail/24643 B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》 https://edu.csdn.net/course/detail/24645  C:《Unity ECS(二) 小试牛刀》 https://edu.csdn.net/course/detail/27096 六、Unity ARPG课程(技术含量:初中级): A:《MMOARPG地下守护神_单机版实战视频课程(上部)》 https://edu.csdn.net/course/detail/24965 B:《MMOARPG地下守护神_单机版实战视频课程(中部)》 https://edu.csdn.net/course/detail/24968 C:《MMOARPG地下守护神_单机版实战视频课程(下部)》 https://edu.csdn.net/course/detail/24979  

    591 人正在学习 去看看 刘国柱

MGS-Camera

概述

Unity3D 场景摄像机控制脚本组件 插件包

需求

  1. 平移摄像机
  2. 环绕摄像机
  3. 平滑对齐摄像机

方案

  1. 基于中心Center计算位移
  2. 基于目标Target计算位移和旋转
  3. 插值位移和旋转

实现

  • 扩展编辑器:显示,调整组件重要参数,辅助组件参数配置。
  • MouseTranslate.cs : 鼠标拖拽平移目标。
  • AroundCamera.cs:目标环绕摄像机。
  • AroundAlignCamera.cs:目标环绕,平滑对齐摄像机。
  • MouseFocus.cs:配合AroundAlignCamera.cs组件实现鼠标双击物体后平滑对齐。
  • AlignMark.cs:目标对齐标记。

案例

路径“Assets/MGS-Camera/Scenes”下存放上述功能组件的使用案例,供读者参考。

源码

源码托管地址

2017-06-08 21:41:27 u014805591 阅读数 1587
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从2018年开始虚拟现实、增强现实、混合现实(VR/AR/MR)技术已经被国家正式列入重点发展产业目录。 由中国通信工业协会协同地方政府主办,国内各大企业与高校积极参与的《世界VR产业大会暨第某届中国国际通信电子产业博览会》每年都会大约10月中旬在南昌市举办, 所以未来的数年将是虚拟现实技术大发展的时期。              本教学视频课程从企业真实虚拟现实项目中提取核心技术要点,总结必须开发功能要素,全面而细致的讲解虚拟现实之汽车模拟仿真项目中需要开发的各个功能模块、开发要点等。 本作从项目环境搭建、汽车零部件素材导入、 汽车零部件模拟拆卸、主摄像机旋转与缩进控制、部件灵活运转算法、部件颜色喷漆、汽车模拟导航、多摄像机镜头处理、项目整体音频音量控制、项目UI设计等方面,给出详细的解决方案。              本课程的细致学习将有助于虚拟现实企业高薪就业与优秀VR项目的高水平研发之目的。 一、热更新系列(技术含量:中高级): A:《lua热更新技术中级篇》 https://edu.csdn.net/course/detail/27087 B:《热更新框架设计之Xlua基础视频课程》 https://edu.csdn.net/course/detail/27110 C:《热更新框架设计之热更流程与热补丁技术》 https://edu.csdn.net/course/detail/27118 D:《热更新框架设计之客户端热更框架(上)》 https://edu.csdn.net/course/detail/27132 E:《热更新框架设计之客户端热更框架(中)》 https://edu.csdn.net/course/detail/27135 F:《热更新框架设计之客户端热更框架(下)》 https://edu.csdn.net/course/detail/27136 二:框架设计系列(技术含量:中级):  A:《游戏UI界面框架设计系列视频课程》 https://edu.csdn.net/course/detail/27142 B:《Unity客户端框架设计PureMVC篇视频课程(上)》 https://edu.csdn.net/course/detail/27172 C:《Unity客户端框架设计PureMVC篇视频课程(下)》 https://edu.csdn.net/course/detail/27173 D:《AssetBundle框架设计_框架篇视频课程》 https://edu.csdn.net/course/detail/27169 三、Unity脚本从入门到精通(技术含量:初级) A:《C# For Unity系列之入门篇》 https://edu.csdn.net/course/detail/4560 B:《C# For Unity系列之基础篇》 https://edu.csdn.net/course/detail/4595 C: 《C# For Unity系列之中级篇》 https://edu.csdn.net/course/detail/24422 D:《C# For Unity系列之进阶篇》 https://edu.csdn.net/course/detail/24465 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级) A:《虚拟现实之汽车仿真模拟系统 》 https://edu.csdn.net/course/detail/26618 五、Unity基础课程系列(技术含量:初级)  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》   https://edu.csdn.net/course/detail/24643 B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》 https://edu.csdn.net/course/detail/24645  C:《Unity ECS(二) 小试牛刀》 https://edu.csdn.net/course/detail/27096 六、Unity ARPG课程(技术含量:初中级): A:《MMOARPG地下守护神_单机版实战视频课程(上部)》 https://edu.csdn.net/course/detail/24965 B:《MMOARPG地下守护神_单机版实战视频课程(中部)》 https://edu.csdn.net/course/detail/24968 C:《MMOARPG地下守护神_单机版实战视频课程(下部)》 https://edu.csdn.net/course/detail/24979  

    591 人正在学习 去看看 刘国柱

这里写图片描述

本篇博文提供一个摄像机控制类,给大家参考和交流!

using UnityEngine;
using System.Collections;

public class MouseOrbit : MonoBehaviour {


    /// <summary>
    /// 得到物体的名字
    /// </summary>
    //public string Getobejctname;

    public Transform initPosObject;

    //public Transform targetObject;

    /// <summary>
    /// ---------------限制速度-----------------------
    /// </summary>

    public float xSpeed = 350.0f;
    public float ySpeed = 250.0f;

    /// <summary>
    /// ------------ 限制X和Y的角度-------------------
    /// </summary>

    public float xMinLimit = -20.0f;
    public float xMaxLimit = 80.0f;

    public float yMinLimit = -20.0f;
    public float yMaxLimit = 80.0f;

    /// <summary>
    /// ---------------限制距离-----------------------
    /// </summary>

    public float initDis = 2.0f;
    public float minDis = 2.0f;
    public float maxDis = 10.0f;

    /// <summary>
    /// ------------------鼠标滚轮速度------------------
    /// </summary>

    public float wheelSpeed = 5.0f;

    public float yMoveSpeed = 1.0f;
    public float xMoveSpeed = 1.0f;

    public  float x = 130.0f;

    public  float y = 30.0f;

    private float distance = 0.0f;

    public bool IsOnHove = false ;




    // Use this for initialization
    void Start () 
    {
        InitOrbitCamera(initPosObject);
    }

   // public Transform getOb;
    bool zoomFlag = false;
    // Update is called once per frame
    void Update () 
    {

        //鼠标浮在NGUI滑条上
        if (!IsOnHove)
        {
            //距离相比较
            distance = Vector3.Distance(Vector3.zero,transform.localPosition);

            x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; // 鼠标横向输入
            x = ClampAngle(x, xMinLimit, xMaxLimit);
            y += Input.GetAxis("Mouse Y") * ySpeed * -0.02f; //鼠标纵向输入
            y = ClampAngle(y, yMinLimit, yMaxLimit);//得到一个适中 的角度

            if (Input.GetMouseButton(0))
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; // 鼠标横向输入
                x = ClampAngle(x, xMinLimit, xMaxLimit);
                y += Input.GetAxis("Mouse Y") * ySpeed * -0.02f; //鼠标纵向输入
                y = ClampAngle(y, yMinLimit, yMaxLimit);//得到一个适中 的角度
            }
            if (Input.GetMouseButtonDown(1))
            {
                if (!zoomFlag)
                {
                    this.GetComponent<Camera>().fieldOfView = 12;
                }
                else {
                    this.GetComponent<Camera>().fieldOfView = 50;
                }
                zoomFlag = !zoomFlag;

            }

            distance-= Input.GetAxis("Mouse ScrollWheel")*wheelSpeed;//距离是用滚轮控制
        }
        //得到适中的距离
        distance = Mathf.Clamp(distance,minDis,maxDis);
        //得到旋转的角度
        if (moveflag)
        {
            Quaternion localRotation = Quaternion.Euler(y, 0, 0);

            Vector3 localPosition = localRotation * new Vector3(0.0f, 0.0f, -1*distance) + Vector3.zero;

            transform.localRotation = localRotation;
            transform.localPosition = localPosition;

            Quaternion rotationP = Quaternion.Euler(0,x, 0);

            transform.parent.rotation = rotationP;


            if(Mathf.Abs(Input.GetAxis("Horizontal"))>0||Mathf.Abs(Input.GetAxis("Vertical"))>0)
            {
                transform.parent.Translate(new Vector3(Input.GetAxis("Horizontal")*xMoveSpeed, 0, Input.GetAxis("Vertical")*xMoveSpeed)*Time.deltaTime);
            }
            if(Input.GetMouseButton(2))
            {
                transform.parent.transform.Translate(0,Input.GetAxis("Mouse Y") * yMoveSpeed,0);
            }
        }

    }
    /// <summary>
    /// 设置相机以某个物体为中心
    /// </summary>
    /// <param name="cObj"></param>
    public void InitOrbitCamera(Transform cObj)
    {
        if(cObj!=null)
        {
            transform.parent.position = cObj.position;
        }
        else
        {
            transform.parent.position = Vector3.zero;
        }

        transform.localRotation = Quaternion.Euler(y,x,0);
        transform.localPosition = Quaternion.Euler(y,x,0) * new Vector3(0.0f,0.0f,-1*initDis);
    }
    //限制角度
    float ClampAngle(float angle,float min,float max)
    {
        if (angle < -360.0f)
        {
            angle += 360.0f;
        }
        if (angle > 360.0f)
        {
            angle -= 360.0f;
        }
        return Mathf.Clamp (angle, min, max);
    }


    private Vector3 targetPos;
    private bool moveflag = true;
    private bool backFlag = false;

    /// <summary>
    /// 返回目标点
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public IEnumerator BackStartPos(Transform obj)
    {
        backFlag = true;
        yield return 1;
        StartCoroutine(SetCameraTarget(obj));
        yield return 1;
    }

    public float TempY;

    public float TempX;
    /// <summary>
    /// 设置相机的目标点
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public IEnumerator SetCameraTarget(Transform obj)
    {
        TempY = y;

        TempX = x;

        bool isMove = true;
        moveflag = false;

        Quaternion localRotation = Quaternion.Euler(y, 0, 0);


        Quaternion rotationP = Quaternion.Euler(0, x, 0);

        Vector3 camEndPos = localRotation * new Vector3(0.0f, 0.0f, -1 * initDis);
        Vector3 camPos;

        if (obj.transform.GetComponent<Collider>())
        {
            camPos = obj.transform.GetComponent<Collider>().bounds.center;
        }
        else
        {
            camPos = obj.transform.position;
        }
        while (isMove)
        {

            transform.localRotation = Quaternion.Lerp(transform.localRotation, localRotation,0.05f);
            transform.localPosition = Vector3.Lerp(transform.localPosition, camEndPos, 0.05f);
            transform.parent.position = Vector3.Lerp(transform.parent.position, camPos, 0.05f);

            transform.parent.rotation = Quaternion.Lerp(transform.parent.rotation, rotationP, 0.05f);

            yield return new WaitForSeconds(0.01f);

            if ((Vector3.Distance(transform.parent.position, camPos) < 0.005f) && (Mathf.Abs((Vector3.Distance(transform.localPosition, Vector3.zero)) - initDis) < 0.01f))
            {
                isMove = false;

                //恢复输入的y的值
                y = TempY;
                //恢复输入的x的值
                x = TempX;

                moveflag = true;
                transform.parent.position = camPos;
                backFlag = false;

                IsOnHove = false;
                break;
            }

        }
    }
}

这里写图片描述

2013-10-28 17:55:38 l2008l 阅读数 3018
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从2018年开始虚拟现实、增强现实、混合现实(VR/AR/MR)技术已经被国家正式列入重点发展产业目录。 由中国通信工业协会协同地方政府主办,国内各大企业与高校积极参与的《世界VR产业大会暨第某届中国国际通信电子产业博览会》每年都会大约10月中旬在南昌市举办, 所以未来的数年将是虚拟现实技术大发展的时期。              本教学视频课程从企业真实虚拟现实项目中提取核心技术要点,总结必须开发功能要素,全面而细致的讲解虚拟现实之汽车模拟仿真项目中需要开发的各个功能模块、开发要点等。 本作从项目环境搭建、汽车零部件素材导入、 汽车零部件模拟拆卸、主摄像机旋转与缩进控制、部件灵活运转算法、部件颜色喷漆、汽车模拟导航、多摄像机镜头处理、项目整体音频音量控制、项目UI设计等方面,给出详细的解决方案。              本课程的细致学习将有助于虚拟现实企业高薪就业与优秀VR项目的高水平研发之目的。 一、热更新系列(技术含量:中高级): A:《lua热更新技术中级篇》 https://edu.csdn.net/course/detail/27087 B:《热更新框架设计之Xlua基础视频课程》 https://edu.csdn.net/course/detail/27110 C:《热更新框架设计之热更流程与热补丁技术》 https://edu.csdn.net/course/detail/27118 D:《热更新框架设计之客户端热更框架(上)》 https://edu.csdn.net/course/detail/27132 E:《热更新框架设计之客户端热更框架(中)》 https://edu.csdn.net/course/detail/27135 F:《热更新框架设计之客户端热更框架(下)》 https://edu.csdn.net/course/detail/27136 二:框架设计系列(技术含量:中级):  A:《游戏UI界面框架设计系列视频课程》 https://edu.csdn.net/course/detail/27142 B:《Unity客户端框架设计PureMVC篇视频课程(上)》 https://edu.csdn.net/course/detail/27172 C:《Unity客户端框架设计PureMVC篇视频课程(下)》 https://edu.csdn.net/course/detail/27173 D:《AssetBundle框架设计_框架篇视频课程》 https://edu.csdn.net/course/detail/27169 三、Unity脚本从入门到精通(技术含量:初级) A:《C# For Unity系列之入门篇》 https://edu.csdn.net/course/detail/4560 B:《C# For Unity系列之基础篇》 https://edu.csdn.net/course/detail/4595 C: 《C# For Unity系列之中级篇》 https://edu.csdn.net/course/detail/24422 D:《C# For Unity系列之进阶篇》 https://edu.csdn.net/course/detail/24465 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级) A:《虚拟现实之汽车仿真模拟系统 》 https://edu.csdn.net/course/detail/26618 五、Unity基础课程系列(技术含量:初级)  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》   https://edu.csdn.net/course/detail/24643 B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》 https://edu.csdn.net/course/detail/24645  C:《Unity ECS(二) 小试牛刀》 https://edu.csdn.net/course/detail/27096 六、Unity ARPG课程(技术含量:初中级): A:《MMOARPG地下守护神_单机版实战视频课程(上部)》 https://edu.csdn.net/course/detail/24965 B:《MMOARPG地下守护神_单机版实战视频课程(中部)》 https://edu.csdn.net/course/detail/24968 C:《MMOARPG地下守护神_单机版实战视频课程(下部)》 https://edu.csdn.net/course/detail/24979  

    591 人正在学习 去看看 刘国柱
其实不需要什么空物体了,war3式的平移效果其实是高度不变平行地面的一个平面上四处移动的问题了,光translate摄像机是不行的 
 
贴上我完整的代码吧
 
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//rts方式镜头移动 旋转 缩放控制 javascript
var ZoomSpeed = 30;//镜头缩放速率
var MovingSpeed = 1;//镜头移动速率
var RotateSpeed = 1;  //镜头旋转速率
private var distance = 0.0f;//保存镜头和中心点的直线距离
  
function Start () {
    //先用镜头斜视的角度和离地面的高度算出距离视野中心的直线距离
    //要省事也可以直接指定一个距离 这个不重要
    //镜头的高度可以减去一个修正值 这样就是正视地图上方的效果 看需要
    distance = Mathf.Abs(transform.position.y/Mathf.Sin(transform.eulerAngles.x));
}
  
function LateUpdate () {
    var rotation;
    var position;
  
    //按住鼠标左键移动鼠标拖动镜头,改成键盘输入或者鼠标靠近屏幕边缘输入都是可以的   
    if(Input.GetMouseButton(0))
    {
        var delta_x = Input.GetAxis("Mouse X") * MovingSpeed;
         var delta_y = Input.GetAxis("Mouse Y") * MovingSpeed;
  
        //镜头其实就是在平行地面的水平面上四处移动 所以构造一个变换矩阵 与世界坐标唯一的差异就是y轴旋转的角度
        rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y,0 );
        //把镜头要移动的分量乘以这个变化矩阵就是相对世界坐标的移动量啦 再加上镜头当前坐标 就是镜头新位置啦
        transform.position =rotation * Vector3(-delta_x,0,-delta_y)+transform.position;
      }
  
            //用滚轮控制镜头拉伸和推进
      if(Input.GetAxis("Mouse ScrollWheel")){   
          var delta_z = -Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
          //直接用镜头的translate函数在镜头参考系Z方向上运动就可以啦
        transform.Translate(0,0,-delta_z);
        //再用delta_z修正镜头与视野中心点的距离 其实不记录也是可以的 每次都用sin算比较麻烦
        distance += delta_z;
    }
  
      //按住鼠标右键移动鼠标旋转镜头
      if (Input.GetMouseButton(1)) {
        var delta_rotation_x = Input.GetAxis("Mouse X") * RotateSpeed;
        var delta_rotation_y = -Input.GetAxis("Mouse Y") * RotateSpeed;
  
       //旋转是以镜头当前视野中心点为原点进行的 在一个平行于地面的水平面上旋转
  
       //先算出当前视野中心的坐标,中心的概念就是正对 上下左右都对齐,离开一个distance距离
       //所以中心点相对镜头参照系的坐标就是0,0,distance,乘以镜头的变换,在加上镜头的世界坐标 就是中心点的世界坐标了
       position =transform.rotation* Vector3(0,0,distance)+transform.position;
  
       //Y轴方向上用世界坐标的变换就可以拉 否则镜头会歪的       
       transform.Rotate(0,delta_rotation_x,0,Space.World);
       //x轴方向的旋转是相对自身的 否则镜头也会歪
       transform.Rotate(delta_rotation_y,0,0);
       //转完以后 把这个新的旋转角度 乘以一个“正对中心”的相对坐标 再加上中心点的坐标 就是新的镜头世界坐标啦
       transform.position =transform.rotation* Vector3(0,0,-distance)+position;
     }
}


 
另存为一个什么xxxx.js 拖给你的摄像机,随便搞个地形走走看吧
如果速度太快/太慢 就调整3个参数吧
 
除去鸡婆的注释和输入 if什么的,全部平移 旋转 缩放 也就是8行代码 基本没有用神马内建的转换功能(用了一次translate),也没有搞什么空物体指引方向、投射x/y/z一堆sin cos什么的。那都不太符合3d编程的基本精神,只用了转换矩阵 坐标变换来搞定全部控制了
 
要注意的是:
旋转其实有两种意思 一种是以摄像机为中心的旋转,那种效果很简单了 就是摄像机在世界的y方向上转一个角度就行了。但是那种旋转不符合rts游戏的要求,举个例子我建了个铁匠铺,挡住了我的小兵,我想转一个角度去点小兵,如果是以摄像机为中心转,那铁匠铺就转出视野了。所以应该是以视野中心转比较符合,虽然这样实现起来麻烦一些。
 
在摄像机的参照系里,屏幕上的东西永远是前方 是z方向上加,摄像机的最中心就是正对位置,在这个位置上中心和摄像机的坐标偏移永远是0,0,镜头距离,有这个前提就能做出各种变化的效果来
 
以摄像机为参照点计算中心,那就是加上镜头距离(摄像机z轴的前方),以中心为参照点计算摄像机应该的位置,就是减去镜头距离,所以这个distance一会加一会减的 想明白了就很好理解了。
 
把中心点的position换成一个目标的position那就是跟随目标进行这3种变换,效果都是一样的,会自动跟随。
紧跟目标屁股后面 那变换方法就是:
Quaternion.Euler(0,target.rotation.eulerAngles.y,0)*(0,0,与目标的距离)+目标当前位置 
想要斜后方紧跟,那就是目标的
Quaternion.Euler(斜视角度,target.rotation.eulerAngles.y,0)*(0,0,与目标的距离)+目标当前位置, 
距离为0那就是
Quaternion.Euler(0,target.rotation.eulerAngles.y,0)*(0,0,0)=0 + 目标当前位置,fps第一人称视角啦。
目标的x z旋转都不用理会的 他摔倒镜头也不用水平转吧。。他往前倾我们也不用跟着他看地板(fps需要这样。。所以很晕)

有变换,神马都是一样的原理。


再贴一个自己写的适合RPG用的镜头跟随脚本,C#的 
 
复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using UnityEngine;
using System.Collections;
  
public class MouseFollow_ForRPG_CSharp : MonoBehaviour {
  
    public GameObject target;
    public float ZoomSpeed = 30;//镜头缩放速率
    public float MovingSpeed = 1;//镜头移动速率
    public float RotateSpeed = 1;  //镜头旋转速率
    public float distance = 20;//设置距离角色的距离
    public float ViewAngle = 30;//设置镜头斜视的角度
  
    void Start () {
        if(target){
            transform.rotation = Quaternion.Euler(ViewAngle, target.transform.rotation.eulerAngles.y,0 );
            transform.position = transform.rotation * new Vector3(0,0,-distance)+target.transform.position;   
        }
    }
  
    void Update () {
        Quaternion rotation;
        Vector3 position;
        float delta_x,delta_y;
        float delta_rotation_x,delta_rotation_y;
  
        if(target){
            if(Input.GetMouseButton(0))
            {
                delta_x = Input.GetAxis("Mouse X") * MovingSpeed;
                delta_y = Input.GetAxis("Mouse Y") * MovingSpeed;
                 rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y,0 );
                  transform.position = rotation * new Vector3(-delta_x,0,-delta_y)+ transform.position;
              }
            else{
                  if(Input.GetAxis("Mouse ScrollWheel")!= 0){   
                      distance += -Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
                }
                  if (Input.GetMouseButton(1)) {
                    delta_rotation_x = Input.GetAxis("Mouse X") * RotateSpeed;
                    delta_rotation_y = -Input.GetAxis("Mouse Y") * RotateSpeed;
                       transform.Rotate(0,delta_rotation_x,0,Space.World);
                       transform.Rotate(delta_rotation_y,0,0);
                 }
                else {
                    transform.rotation = Quaternion.Slerp(transform.rotation,
                        Quaternion.Euler(transform.rotation.eulerAngles.x, target.transform.rotation.eulerAngles.y,0
                        ),Time.deltaTime*2);
                }
                transform.position = transform.rotation* new Vector3(0,0,-distance)+ target.transform.position;
            }
        }
    }
}


copy另存为MouseFollow_ForRPG_CSharp.cs,拖给你的镜头,就能用啦。想跟随哪一个就把目标物体拖到Inspector里target那一栏。
自动跟随角色正后方,按住鼠标右键移动鼠标,围着角色上下左右旋转镜头,滚轮缩放,放开鼠标镜头自动平滑的转回后方跟随的角度,镜头高度不变,经典的魔兽世界控制方式。另外多一个魔兽没有的功能,左键按住移动鼠标可以冻结摄像机镜头上下左右拖动,因为只是演示控制,一般左键都是战斗相关的功能,不想要把那几行删掉就行啦。全部这些核心变换代码也就10行左右。
 
如果不是用理论的旋转模型,那这个问题就太复杂啦 目标在动 在旋转,镜头相对目标又在动在旋转,要加多少参考物体,搞多少x/y/z分量的投射变换啊。。思维方式很重要
 
原理都一样 不细说了,变化就是把rts的以视野中心为参考改成了以目标为参考
一个细节就是因为要跟随,所以不管有没有输入每次update都要参考目标位置修正镜头位置的,否则就不叫跟随了。

转载自 http://game.ceeger.com/forum/read.php?tid=2703&fid=2

2019-01-15 11:14:26 wl1611102 阅读数 419
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从2018年开始虚拟现实、增强现实、混合现实(VR/AR/MR)技术已经被国家正式列入重点发展产业目录。 由中国通信工业协会协同地方政府主办,国内各大企业与高校积极参与的《世界VR产业大会暨第某届中国国际通信电子产业博览会》每年都会大约10月中旬在南昌市举办, 所以未来的数年将是虚拟现实技术大发展的时期。              本教学视频课程从企业真实虚拟现实项目中提取核心技术要点,总结必须开发功能要素,全面而细致的讲解虚拟现实之汽车模拟仿真项目中需要开发的各个功能模块、开发要点等。 本作从项目环境搭建、汽车零部件素材导入、 汽车零部件模拟拆卸、主摄像机旋转与缩进控制、部件灵活运转算法、部件颜色喷漆、汽车模拟导航、多摄像机镜头处理、项目整体音频音量控制、项目UI设计等方面,给出详细的解决方案。              本课程的细致学习将有助于虚拟现实企业高薪就业与优秀VR项目的高水平研发之目的。 一、热更新系列(技术含量:中高级): A:《lua热更新技术中级篇》 https://edu.csdn.net/course/detail/27087 B:《热更新框架设计之Xlua基础视频课程》 https://edu.csdn.net/course/detail/27110 C:《热更新框架设计之热更流程与热补丁技术》 https://edu.csdn.net/course/detail/27118 D:《热更新框架设计之客户端热更框架(上)》 https://edu.csdn.net/course/detail/27132 E:《热更新框架设计之客户端热更框架(中)》 https://edu.csdn.net/course/detail/27135 F:《热更新框架设计之客户端热更框架(下)》 https://edu.csdn.net/course/detail/27136 二:框架设计系列(技术含量:中级):  A:《游戏UI界面框架设计系列视频课程》 https://edu.csdn.net/course/detail/27142 B:《Unity客户端框架设计PureMVC篇视频课程(上)》 https://edu.csdn.net/course/detail/27172 C:《Unity客户端框架设计PureMVC篇视频课程(下)》 https://edu.csdn.net/course/detail/27173 D:《AssetBundle框架设计_框架篇视频课程》 https://edu.csdn.net/course/detail/27169 三、Unity脚本从入门到精通(技术含量:初级) A:《C# For Unity系列之入门篇》 https://edu.csdn.net/course/detail/4560 B:《C# For Unity系列之基础篇》 https://edu.csdn.net/course/detail/4595 C: 《C# For Unity系列之中级篇》 https://edu.csdn.net/course/detail/24422 D:《C# For Unity系列之进阶篇》 https://edu.csdn.net/course/detail/24465 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级) A:《虚拟现实之汽车仿真模拟系统 》 https://edu.csdn.net/course/detail/26618 五、Unity基础课程系列(技术含量:初级)  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》   https://edu.csdn.net/course/detail/24643 B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》 https://edu.csdn.net/course/detail/24645  C:《Unity ECS(二) 小试牛刀》 https://edu.csdn.net/course/detail/27096 六、Unity ARPG课程(技术含量:初中级): A:《MMOARPG地下守护神_单机版实战视频课程(上部)》 https://edu.csdn.net/course/detail/24965 B:《MMOARPG地下守护神_单机版实战视频课程(中部)》 https://edu.csdn.net/course/detail/24968 C:《MMOARPG地下守护神_单机版实战视频课程(下部)》 https://edu.csdn.net/course/detail/24979  

    591 人正在学习 去看看 刘国柱

Unity3D_控制摄像机跟随物体

情景一:第三人称跟随

1、效果描述:摄像机一直跟随在物体的后上方,并一直看向物体
2、代码实现:
挂载到Camera上

public class LookAtObject : MonoBehaviour {

	private Transform transformOfTargetObject;//被跟随物体
	private Vector3 offset;//差量
	private Vector3 targetPosition;//
	private float speed=5;
	void Start () {
		transformOfTargetObject=GameObject.Find("Cube").GetComponent<Transform>();
		offset=gameObject.transform.position-transformOfTargetObject.position;
	}
	
	void Update () {
		targetPosition=transformOfTargetObject.position+transformOfTargetObject.TransformDirection(offset);/*一定要
									transformOfTargetObject.TransformDirection(offset),不然摄像机不会跟在物体后面*/
		gameObject.transform.position=Vector3.Lerp(gameObject.transform.position,targetPosition,Time.deltaTime*speed);
		gameObject.transform.LookAt(transformOfTargetObject);
	}

3、结果:在这里插入图片描述

情景二:全局观测:

1、效果描述:对于有两个游戏角色,需要同时观测到他们,并能将他们维持在视野当中
2、代码实现:
代码添加到Camera上

public class LookAtThem : MonoBehaviour {

	public GameObject play1;
	public GameObject play2;
	private Camera m_camera;
	private Vector3 offset;
	private float viewScale;
	
	void Start () {
		offset=gameObject.transform.position-(play1.transform.position+play2.transform.position)/2;
		m_camera=this.GetComponent<Camera>();
		viewScale=m_camera.fieldOfView/Vector3.Distance(play1.transform.position,play2.transform.position);
	}
	
	void Update () {
		this.transform.position=(play1.transform.position+play2.transform.position)/2+offset;
		m_camera.fieldOfView=Vector3.Distance(play1.transform.position,play2.transform.position)*viewScale;
	}
}

3、结果
移开时
在这里插入图片描述
移近时
在这里插入图片描述

2017-10-20 13:10:57 qq_33994566 阅读数 6480
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从2018年开始虚拟现实、增强现实、混合现实(VR/AR/MR)技术已经被国家正式列入重点发展产业目录。 由中国通信工业协会协同地方政府主办,国内各大企业与高校积极参与的《世界VR产业大会暨第某届中国国际通信电子产业博览会》每年都会大约10月中旬在南昌市举办, 所以未来的数年将是虚拟现实技术大发展的时期。              本教学视频课程从企业真实虚拟现实项目中提取核心技术要点,总结必须开发功能要素,全面而细致的讲解虚拟现实之汽车模拟仿真项目中需要开发的各个功能模块、开发要点等。 本作从项目环境搭建、汽车零部件素材导入、 汽车零部件模拟拆卸、主摄像机旋转与缩进控制、部件灵活运转算法、部件颜色喷漆、汽车模拟导航、多摄像机镜头处理、项目整体音频音量控制、项目UI设计等方面,给出详细的解决方案。              本课程的细致学习将有助于虚拟现实企业高薪就业与优秀VR项目的高水平研发之目的。 一、热更新系列(技术含量:中高级): A:《lua热更新技术中级篇》 https://edu.csdn.net/course/detail/27087 B:《热更新框架设计之Xlua基础视频课程》 https://edu.csdn.net/course/detail/27110 C:《热更新框架设计之热更流程与热补丁技术》 https://edu.csdn.net/course/detail/27118 D:《热更新框架设计之客户端热更框架(上)》 https://edu.csdn.net/course/detail/27132 E:《热更新框架设计之客户端热更框架(中)》 https://edu.csdn.net/course/detail/27135 F:《热更新框架设计之客户端热更框架(下)》 https://edu.csdn.net/course/detail/27136 二:框架设计系列(技术含量:中级):  A:《游戏UI界面框架设计系列视频课程》 https://edu.csdn.net/course/detail/27142 B:《Unity客户端框架设计PureMVC篇视频课程(上)》 https://edu.csdn.net/course/detail/27172 C:《Unity客户端框架设计PureMVC篇视频课程(下)》 https://edu.csdn.net/course/detail/27173 D:《AssetBundle框架设计_框架篇视频课程》 https://edu.csdn.net/course/detail/27169 三、Unity脚本从入门到精通(技术含量:初级) A:《C# For Unity系列之入门篇》 https://edu.csdn.net/course/detail/4560 B:《C# For Unity系列之基础篇》 https://edu.csdn.net/course/detail/4595 C: 《C# For Unity系列之中级篇》 https://edu.csdn.net/course/detail/24422 D:《C# For Unity系列之进阶篇》 https://edu.csdn.net/course/detail/24465 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级) A:《虚拟现实之汽车仿真模拟系统 》 https://edu.csdn.net/course/detail/26618 五、Unity基础课程系列(技术含量:初级)  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》   https://edu.csdn.net/course/detail/24643 B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》 https://edu.csdn.net/course/detail/24645  C:《Unity ECS(二) 小试牛刀》 https://edu.csdn.net/course/detail/27096 六、Unity ARPG课程(技术含量:初中级): A:《MMOARPG地下守护神_单机版实战视频课程(上部)》 https://edu.csdn.net/course/detail/24965 B:《MMOARPG地下守护神_单机版实战视频课程(中部)》 https://edu.csdn.net/course/detail/24968 C:《MMOARPG地下守护神_单机版实战视频课程(下部)》 https://edu.csdn.net/course/detail/24979  

    591 人正在学习 去看看 刘国柱

最近公司的几个项目开发内容基本相同,很多脚本直接复制过来就可以拼接项目。之前一直是代码爱好者,能自己敲的绝对不去复制粘贴。但是开发速度确实是被耽误了,所以接下来打算把开发中常用的脚本都发到博客上。自己需要的时候直接拿来。也希望能帮到你们。

unity编辑器中按住鼠标右键,在通过控制键盘的wasdqe键可以自由控制视野。下面就是实现操作的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//巡游模式摄像机控制
public class CameraMove : MonoBehaviour
{

    public static CameraMove Instance = null;
    
    private Vector3 dirVector3;
    private Vector3 rotaVector3;
    private float paramater = 0.1f;
    //旋转参数
    private float xspeed = -0.05f;
    private float yspeed = 0.1f;

	private float dis;

    void Awake ()
	{
	    Instance = this;
	}

    private void Start()
    {
        rotaVector3 = transform.localEulerAngles;
		dis = UIFuc.Instance.Dis;
    }

    // Update is called once per frame
	void FixedUpdate ()
    {
        //旋转
        if (Input.GetMouseButton(1))
        {
            rotaVector3.y += Input.GetAxis("Horizontal") * yspeed;
            rotaVector3.x += Input.GetAxis("Vertical") * xspeed;
            transform.rotation = Quaternion.Euler(rotaVector3);
        }

        //移动
        dirVector3 =Vector3.zero;

        if (Input.GetKey(KeyCode.W))
        {
            if(Input.GetKey(KeyCode.LeftShift)) dirVector3.z = 3;
            else dirVector3.z = 1;
        }
        if (Input.GetKey(KeyCode.S))
        {
            if (Input.GetKey(KeyCode.LeftShift)) dirVector3.z = -3;
            else dirVector3.z = -1;
        }
        if (Input.GetKey(KeyCode.A))
        {
            if (Input.GetKey(KeyCode.LeftShift)) dirVector3.x = -3;
            else dirVector3.x = -1;
        }
        if (Input.GetKey(KeyCode.D))
        {
            if (Input.GetKey(KeyCode.LeftShift)) dirVector3.x = 3;
            else dirVector3.x = 1;
        }
        if (Input.GetKey(KeyCode.Q))
        {
            if (Input.GetKey(KeyCode.LeftShift)) dirVector3.y = -3;
            else dirVector3.y = -1;
        }
        if (Input.GetKey(KeyCode.E))
        {
            if (Input.GetKey(KeyCode.LeftShift)) dirVector3.y = 3;
            else dirVector3.y = 1;
        }
        transform.Translate(dirVector3 * paramater,Space.Self);
        //限制摄像机范围
		transform.position = Vector3.ClampMagnitude(transform.position, dis);
    }
}


由于项目需要限制摄像机的移动范围,所以我在最后加上了限制的代码。

没有更多推荐了,返回首页