2019-11-07 23:17:53 Maykidd 阅读数 15
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从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  

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

unity3d粒子系统

本次作业基本要求是三选一
1、简单粒子制作
按参考资源要求,制作一个粒子系统,参考资源
使用 3.3 节介绍,用代码控制使之在不同场景下效果不一样
2、完善官方的“汽车尾气”模拟
使用官方资源资源 Vehicle 的 car, 使用 Smoke 粒子系统模拟启动发动、运行、故障等场景效果
3、参考 http://i-remember.fr/en 这类网站,使用粒子流编程控制制作一些效果, 如“粒子光环”

个人选择了粒子关环

成品图:
在这里插入图片描述



1.我们要首先定义新的结构ParticleData,用来记录每个粒子的当前半径、角度和运动的时间。

//记录每个粒子的属性:
public class ParticleData
{
    public float radius, angle, time;
    public ParticleData(float radius_,float angle_,float time_)
    {
        radius = radius_;   //半径
        angle = angle_;     //角度
        time = time_;       //运动的时间
    }
}

2.声明ParticleHalo的私有变量,ParticleData。

//定义一个粒子系统的变量,粒子的数组和对应的粒子的数据
    private ParticleSystem particleSys;                 //粒子系统
    private ParticleSystem.Particle[] particleArray;    //粒子数组
    private ParticleData[] particleData;                //粒子数据数组

    //声明变量
    public int count = 10000;       // 粒子数量  
    public float size = 0.03f;      // 粒子大小  
    public float minRadius = 5.0f;  // 最小半径  
    public float maxRadius = 12.0f; // 最大半径  
    public bool clockwise = true;   // 顺时针|逆时针  
    public float speed = 2f;        // 速度  
    public float pingPong = 0.02f;  // 游离范围
    private int diff = 100;          // 速度差分层数  

    //颜色,在Inspector窗口里改变colorGradient的值:
    public Gradient colorGradient;

3.初始化设置

 //实例化粒子系统和初始化各粒子的属性与位置
    private void Start()
    {
        //初始化粒子数组
        particleArray = new ParticleSystem.Particle[count];
        particleData = new ParticleData[count];

        //初始化粒子系统
        particleSys = this.GetComponent<ParticleSystem>();
        particleSys.startSpeed = 0;         //粒子初始速度
        particleSys.startSize = size;       //粒子大小
        particleSys.loop = false;
        particleSys.maxParticles = count;   //最大粒子数
        particleSys.Emit(count);            //发射粒子
        particleSys.GetParticles(particleArray);

        RandomlySpread();// 初始化各粒子位置 
    }
  1. RandomlySpread()将所有的粒子随机分布在圆圈轨道上。
void RandomlySpread()
    {
        float midRadius, minRate, maxRate, radius,angle,theta,time;

        //初始化粒子位置;
        for (int i = 0; i < count; i++)
        {
            // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近 
            midRadius = (maxRadius + minRadius) / 2;
            minRate = Random.Range(1.0f, midRadius / minRadius);
            maxRate = Random.Range(midRadius / maxRadius, 1.0f);
            radius = Random.Range(minRadius * minRate, maxRadius * maxRate);

            // 随机每个粒子的角度  
            angle = Random.Range(0.0f, 360.0f);
            theta = angle / 180 * Mathf.PI;

            // 随机每个粒子的游离起始时间
            time = Random.Range(0.0f, 360.0f);
     
            particleData[i] = new ParticleData(radius,angle,time);
        
           particleArray[i].position = new Vector3(particleData[i].radius * Mathf.Cos(theta), particleData[i].radius * Mathf.Sin(theta),0f);
        }
        particleSys.SetParticles(particleArray, particleArray.Length);
    }

5.旋转:让每个粒子的角度在每一帧都减少或增加一个值,速度差分层数让不同层的粒子转的速度不一样:

//旋转
    private void Update()
    {
        float theta;
        for (int i = 0; i < count; i++)
        {
            if (clockwise)//顺时针旋转
                particleData[i].angle -= (i % diff + 1) * (speed / particleData[i].radius / diff); 
            else//逆时针旋转
                particleData[i].angle += (i % diff + 1) * (speed / particleData[i].radius / diff);
            
            // 保证angle在到360度
            particleData[i].angle = (360.0f + particleData[i].angle) % 360.0f;
            theta = particleData[i].angle / 180 * Mathf.PI;

            //跳动效果
            particleData[i].time += Time.deltaTime;
            particleData[i].radius += Mathf.PingPong(particleData[i].time / minRadius / maxRadius, pingPong) - pingPong / 2.0f;
            particleArray[i].position = new Vector3(particleData[i].radius * Mathf.Cos(theta), particleData[i].radius * Mathf.Sin(theta), 0f);
        }

        //调用改变颜色的函数
        changeColor();
        particleSys.SetParticles(particleArray, particleArray.Length);
    }

6.颜色变换

在Inspector窗口里改变colorGradient的值:

void changeColor()
    {
        float colorValue;
        for (int i = 0; i < count; i++)
        {
            //改变颜色
            colorValue = (Time.realtimeSinceStartup - Mathf.Floor(Time.realtimeSinceStartup));
            colorValue += particleData[i].angle/360;
            while (colorValue > 1)
                colorValue--;
            particleArray[i].color = colorGradient.Evaluate(colorValue);
            //particleArray[i].color = colorGradient.Evaluate(Random.value);
        }
    }

7.创建一个对象,然后往对象里面添加空对象,然后给里面的对象添加ParticleSystem组件

8.运行得到结果图:
在这里插入图片描述

2015-04-29 13:44:32 nijiayy 阅读数 4042
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从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  

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

    最近学习了Unity3d这个游戏引擎,感觉真的是非常的强大,正好赶上操作系统课程要做一个模拟信号量的模拟程序,于是打算做一个模拟十字路口的程序,大致的实现要实现的成果是:存在四种不同的汽车,包括一辆警车(不受交通信号灯的控制)随机产生在不同的路口,并且有不同的行动路线如:直走,左转,右转等,当然还有交通信号灯来控制车辆的有序运行。可以展示不同的视角来观察路口的情况(利用Q,W,E,R分别控制不同的视角),ok,废话不多说,下面来讲述一下具体的实现方案!毕竟初学,肯定会存在一些不足之处,还望见谅~

   下面来看一下我们最终实现的界面吧~


这个是最初的W视图


这个是Q视图


这个是E视图


这个是R视图

ok,我这里资源页有这里的脚本的下载,如果有需要的可以下载交流哈~

接下来的几个blog我会细细的讲述一下具体的实现过程!

资源地址:http://download.csdn.net/detail/nijiayy/8645197



2010-01-28 16:10:00 cancer05 阅读数 861
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从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  

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

简单的样品,wasd控制车

http://www.doasp.net/unity3d/rav4.html

 

2013-08-26 11:30:08 Ralfkaka 阅读数 1964
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从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  

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

做游戏少不了控制,但是一个成熟的游戏引擎,是不能简单仅仅获取键盘中或者遥感确定的按键来控制,要考虑到用户更改游戏按键的情况,当然也得考虑到不同设备的不通输入方式,比如U3D是可以运行在iphone上的,iphone可没有键盘和上下左右键,他有平衡控制(简单化解为水平和垂直两个方向度数),如果用户使用飞行或者汽车方向盘手柄,那就不能简单用一个按键来描述了,需要有一个度数的问题(也可以简单分解为水平和垂直两个方向度数)。 


U3D提供了一个Input类封装控制输入,不做详细解释,在后面我会举一些常用的例子来说明。 

Class Variables 
mousePositionThe current mouse position in pixel coordinates. (Read Only) 
anyKeyIs any key or mouse button currently held down? (Read Only) 
anyKeyDownReturns true the first frame the user hits any key or mouse button (Read Only). 
inputStringReturns the keyboard input entered this frame (Read Only).
Class Functions 
GetAxisReturns the value of the virtual axis identified by axisName. 
GetAxisRawReturns the value of the virtual axis identified by axisName with no smoothing filtering applied. 
GetButtonReturns true while the virtual button identified by buttonName is held down. 
GetButtonDownReturns true during the frame the user pressed down the virtual button identified by buttonName. 
GetButtonUpReturns true the first frame the user releases the virtual button identified by buttonName. 
GetKeyReturns true while the user holds down the key identified by name. Think auto fire. 
GetKeyDownReturns true during the frame the user starts pressing down the key identified by name. 
GetKeyUpReturns true during the frame the user releases the key identified by name. 
GetMouseButtonReturns whether the the given mouse button is held down. 
GetMouseButtonDownReturns true during the frame the user pressed the given mouse button. 
GetMouseButtonUpReturns true during the frame the user releases the given mouse button. 
ResetInputAxesResets all input. After ResetInputAxes all axes return to 0 and all buttons return to 0 for one frame. 


--------------------------------------------------------------------------------------------------------------------------------- 
获取键盘某一(这里是空格键)按键状态(bool):Input.GetKeyDown(KeyCode.Space)              这是最不通用的写法,不推荐 
获取虚拟按键(这里是Jump)按键状态(bool):Input.GetButton("Jump")       推荐用这种写法,用户可以设置按键Jump为空格键(默认就是空格) 
获取遥感(或iphone感应)垂直轴力度(是一个0-1之间的float):Input.GetAxis("Vertical“)  推荐写法,键盘的话默认按w或者up会瞬间提到1,要是遥感的话可以控制一个度,再乘以力的方向向量的话,就可以控制汽车之类的加速了。如果你直接写成键盘的w或者d,那就没办法控制力度了。 
获取遥感(或iphone感应)水平轴力度(同上):Input.GetAxis("Horizontal") 
获取鼠标中键状态:Input.GetAxis("Mouse ScrollWheel") 

注:有些遥感可能水平方向会转超过1或者小于0的值出来(例如汽车遥感),为了避免错误的计算(乘以负数的话向量的方向可是会相反的),可以配合数学函数Mathf.Clamp01()来固定他的值在0和1之间。例如: 
motor = Mathf.Clamp01(Input.GetAxis("Vertical")); //设置汽车引擎力度为垂直方向力度 
2019-09-02 22:05:32 weixin_44831924 阅读数 759
  • 虚拟现实之汽车模拟仿真项目开发

    详细概述:         从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  

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


        WheelCollider(车轮碰撞器)是一种特殊的地面车辆碰撞器,它具有内置的碰撞检测、车轮物理引擎和一个基于滑移的轮胎摩擦模型。WheelCollider是专门为有轮子的车辆所做的设计。此处把坦克作为车辆来实现坦克的车辆碰撞和车辆运动。

车轮碰撞器

      在添加轮子时,给车辆(此处是坦克整体tank)添加碰撞器Rigidbody,且坦克较重,需要在Rigidbody中调整坦克的质量(Mass属性,这里调整为300),如下图:

在这里插入图片描述
       在坦克模型下建立名为PhysicalBody的空物体,用于存放坦克的碰撞器组件。再在PhysicalBody里添加wheelL1、wheelL2、wheelR1、wheelR2这4个空物体代表坦克的四个轮子。在PhysicalBody里添加2个名为collider的空物体,用于给坦克添加碰撞器(坦克车身有上下两部分,故添加2个collider),此时坦克层次模型如下图:
在这里插入图片描述
       给2个collider添加BoxCollider组件(Component --> Physics --> Box Collider),然后点击collider的属性面板的Edit Collider调整位置和大小。再给4个轮子分别添加WheelCollider(Component --> Physics --> WheelCollider),调整位置和大小,注意轮子的位置、大小、角度的细微差别会影响物理性能,所以要根据Transform的数值进行调整。L1表示左前轮,L2表示左后轮,R1表示右前轮,R2表示右后轮。最后调整结果见下图:

在这里插入图片描述

WheelCollider的属性

       WheelCollider是用Unity3D制作汽车类型游戏的关键所在,它不仅可以模拟轮子的碰撞过程,还模拟了汽车的悬挂系统、引擎系统、轮胎摩擦等汽车的关键物理特性。WheelCollider的属性及说明见下表:

属性 说明
mass 车轮的质量
radius 轮子半径
suspensionDistance 车轮悬挂的最大延长距离
center 轮子的中心位置(相对于本地坐标系)
suspensionSpring 车轮悬挂的参数,通过添加弹簧和阻尼力,悬挂试图达到的目标位置
forwardFriction 在车轮指向方向上的摩擦力的属性
sidewaysFriction 轮胎侧面方向上的摩擦力的属性

       车轮是由motorTorque、brakeTorque和steerAngle属性控制的,它们的含义见下表:

属性或方法 说明
motorTorque 在轮轴上的电机力矩
brakeTorque 刹车的力矩
steerAngle 车轮转向角度

       一般来说,重心、悬挂系统和轮胎(摩擦力属性)对汽车的性能有着很大的影响。

  1. 重心:由于车辆的重心通常不是车的中心位置,若要得到更真实的效果,可以通过代码设置Rigidbody.centerOfMass来调整重心位置。
  2. 悬挂系统:车的悬挂系统可以增强轮胎和路面的摩擦。下面是与悬挂系统有关的参数及说明:
属性或方法 说明
spring 悬挂弹簧。该值决定了 悬挂弹簧的刚性,把它设得很高可以使弹簧很软,所以车轮将有更大的震动范围,把它设得很小,将使悬挂很硬
damper 悬挂阻尼器,可以使弹簧震动变得平滑
targetPosition 目标位置。静止状态下悬挂的距离,0表示充分伸展弹簧,1表示充分压缩弹簧
  1. 轮胎摩擦力:Forward Friction是前后方向的摩擦力属性,影响motorTorque和brakeTorque的效果。Sideways Friction是左右方向的摩擦力属性,影响steerAngle的效果。下面是与摩擦力相关的参数及说明:
参数 说明
extremumSlip 滑动极值点(默认为1)
exyremumValue 滑动极值的力(默认为20000)
asymptoteSlip 渐近线滑动点(默认为2)
asymptoteValue 渐近线滑动上的力(默认为10000)
stiffness 用于extremumValue和asymptoteValue值的倍数(默认为1)

控制车辆

       汽车的前轮和后轮分别悬挂在两条轴上,每条轴上两个轮子的步调是一致的。新建名为AxleInfo的Script脚本,添加代表车轴信息的AxleInfo类,(此处的炮管可参见前面的博客)代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable] //代表串行化,添加该标记的目的在于,使类成员可以在属性面板中显示
public class AxleInfo 
{
    public WheelCollider leftWheel;
    public WheelCollider rightWheel;
    public bool motor;
    public bool steering;
}

      编写名为tank的Script脚本拖到坦克上,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tank : MonoBehaviour
{
  //炮塔
  public Transform turret;
  //炮塔旋转速度
  private float turretRotSpeed = 0.5f;

  //炮管
  public Transform gun;
  //炮管的旋转范围
  private float maxRoll = 10f;
  private float minRoll = -4f;
  //炮塔炮管目标角度
  private float turretRotTarget = 0;
  private float turretRollTarget = 0;

  //轮轴
  public List<AxleInfo> axleInfos;
  //马力和最大马力
  private float motor = 0;
  public float maxMotorTorque;
  //制动和最大制动
  private float brakeTorque = 0;
  public float maxBrakeTorque = 100;
  //转向角和最大转向角
  private float steering = 0;
  public float maxSteeringAngle;

  //开始时执行
  void Start()
  {
      //获取炮塔
      turret = transform.Find("turret");
      //获取炮塔
      gun = turret.Find("gun");
  }

  //每帧执行一次
  void Update()
  {
     
      //玩家控制操作
      PlayerCtrl();
      //遍历车轴
      foreach(AxleInfo axleInfo in axleInfos)
      {
          //转向
          if (axleInfo.steering)
          {
              axleInfo.leftWheel.steerAngle = steering;
              axleInfo.rightWheel.steerAngle = steering;
          }
          //马力
          if (axleInfo.motor)
          {
              axleInfo.leftWheel.motorTorque = motor;
              axleInfo.rightWheel.motorTorque = motor;
          }
          //制动
          if (true)
          {
              axleInfo.leftWheel.brakeTorque = brakeTorque;
              axleInfo.rightWheel.brakeTorque = brakeTorque;
          }
      }
      //炮塔炮管旋转
      TurretRotation();
      TurretRoll();
  }

  //炮塔旋转
  public void TurretRotation()
  {
      if (Camera.main == null)
          return;
      if (turret == null)
          return;
      //归一化角度
      float angle = turret.eulerAngles.y - turretRotTarget;
      if (angle < 0)
          angle += 360;
      if (angle > turretRotSpeed && angle < 180)
          turret.Rotate(0f, -turretRotSpeed, 0f);
      else if (angle > 180 && angle < 360 - turretRotSpeed)
          turret.Rotate(0f, turretRotSpeed, 0f);
  }

  //旋转炮管
  public void TurretRoll()
  {
      if (Camera.main == null)
          return;
      if (turret == null)
          return;
      //获取角度
      Vector3 worldEuler = gun.eulerAngles;
      Vector3 localEuler = gun.localEulerAngles;
      //世界坐标系角度计算
      worldEuler.x = turretRollTarget;
      gun.eulerAngles = worldEuler;
      //本地坐标系角度限制
      Vector3 euler = gun.localEulerAngles;
      if (euler.x > 180)
          euler.x -= 360;
      if (euler.x > maxRoll)
          euler.x = maxRoll;
      if (euler.x < minRoll)
          euler.x = minRoll;
      gun.localEulerAngles = new Vector3(euler.x, localEuler.y, localEuler.z);
  }

  //玩家控制
  public void PlayerCtrl()
  {
      //马力和转向角
      motor = maxMotorTorque * Input.GetAxis("Vertical");
      steering = maxSteeringAngle * Input.GetAxis("Horizontal");
      //炮管炮塔角度
      turretRotTarget = Camera.main.transform.eulerAngles.y;
      turretRollTarget = Camera.main.transform.eulerAngles.x;
  }
}

     最后设置tank模型的AxleInfos的size设置为2(前后两条车轴),并将4个WheelCollider拖入其中,设置为后驱,如下图:

在这里插入图片描述
     选择坦克的4个WheelCollider,调整参数,可以得到更好的体验,见下图:

在这里插入图片描述

刹车

     玩家按下后退键时,是刹车还是后退。可以使用车轮碰撞器的rpm(转速)属性判断。如果转速大于某个值(这里取5),可以视为坦克前进,小于某个值(这里取-5)为后退,转速为0则表示静止,而不单单根据后退键来看。修改PlayerCtrl,代码如下:

 public void PlayerCtrl()
    {
        //马力和转向角
        motor = maxMotorTorque * Input.GetAxis("Vertical");
        steering = maxSteeringAngle * Input.GetAxis("Horizontal");
        //制动
        brakeTorque = 0;
        foreach(AxleInfo axlenInfo in axleInfos)
        {
            //前进时,按下“下”键
            if (axlenInfo.leftWheel.rpm > 5 && motor < 0)
                brakeTorque = maxBrakeTorque;
            //后退时,按下“上”键
            else if(axlenInfo.leftWheel.rpm <-5 && motor > 0)
                brakeTorque = maxBrakeTorque;
            continue;
        }
        //炮管炮塔角度
        turretRotTarget = Camera.main.transform.eulerAngles.y;
        turretRollTarget = Camera.main.transform.eulerAngles.x;
    }

     运行游戏,可以体验到刹车效果。

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