2012-10-06 23:15:14 tinya0913 阅读数 7946
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

本视频主要讲述Unity3d中实现飞行模拟的方法,通过本次课程我们将学会在空间中实现自由飞行的控制,效果类似二战空骑兵、鹰击长空等飞行模拟类游戏。课程中我也将会给大家介绍相关的飞行原理,介绍飞机的基本构成、飞机的常用布局、飞行姿态控制等航空方面的基础知识。

更多内容请关注新浪微博@筑梦天下文化科技 http://weibo.com/mongtx


请同时关注团队新微博@筑梦创想 http://weibo.com/mongcc

此外,本人是广州在校大三学生(软件工程专业),现在诚求各单位提供实习岗位,我希望能通过实习进一步提高个人专业技能和充实职业工作经验,欢迎对我感兴趣的单位随时与我联系,此外我们团队将会继续推出更多精品的课程为大家服务,希望大家能继续支持,持续关注,谢谢大家!

联系方式
E-mail:gsh0913@qq.com
QQ:264965161

教学视频地址:http://www.tudou.com/programs/view/rBreIRfIsVE/?resourceId=0_06_02_99


公开课片头_1280_800.png

2012-4-4 20:12:51 上传
下载附件 (499.31 KB)


内容提要_1280_800.png

2012-4-4 20:13:07 上传
下载附件 (273.07 KB)


飞行截图.jpg

2012-4-4 20:13:14 上传
下载附件 (34.92 KB)


飞行截图2.jpg

2012-4-4 20:13:19 上传
下载附件 (35.07 KB)


截图01.jpg

2012-4-4 20:17:28 上传
下载附件 (31.57 KB)


截图02.jpg

2012-4-4 20:17:41 上传
下载附件 (33.55 KB)


截图03.jpg

截图04.jpg

PS:由于有部分网友反映本工作室发布的视频教程内容过于简单,我们希望在此声明一下,我们发布教学视频的目的并不是为了炫耀些什么,教程大部分都为基础知识,面向的主要为入门级的网友。我们希望有更多的网友能通过我们的视频进入游戏开发的殿堂,并且我们希望通过本系列教程结交到更多热爱游戏的朋友,我们的教程会遵循渐进的原则,步步为营由浅及深,希望大家多多包含,继续鼎力支持!

2016-10-12 16:03:35 qq_28221881 阅读数 7449
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

值得注意的是,模型要于代码的方向和轴向一致,多多改几次就能调整合适的了。

制作空物体,放在飞机模型合适的位置

using UnityEngine;
using System.Collections;

public class FlyTest : MonoBehaviour {
    public GameObject box;

    private Transform Head;
    private Transform LeftAirfoil;
    private Transform RightArifoil;
    private Transform LeftTailAirfoil;
    private Transform RightTailAirfoil;


    private float speed = 250.0f;

    private Rigidbody rb;

    void Start()
    {
        box = GameObject.Find("Plane");

        Head = transform.Find("Head");
        LeftAirfoil = transform.Find("LeftAirfoil");
        RightArifoil = transform.Find("RightAirfoil");
        LeftTailAirfoil = transform.Find("LeftTailAirfoil");
        RightTailAirfoil = transform.Find("RightTailAirfoil");

        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
       
        transform.Translate(Vector3.right * Time.deltaTime);
        //俯冲
        if(Input .GetKey (KeyCode.W ))
        {
            rb.AddForceAtPosition(transform.up * 5.0f, LeftTailAirfoil.position);

            rb.AddForceAtPosition(transform.up * 5.0f, RightTailAirfoil.position);
        }
         //爬升
        else if(Input .GetKey (KeyCode .S ))
        {
            rb.AddForceAtPosition(transform.up * -5.0f, LeftTailAirfoil.position);

            rb.AddForceAtPosition(transform.up * -5.0f, RightTailAirfoil.position);
        }
        //左翻滚
        else if(Input .GetKey (KeyCode .A ))
        {
            rb.AddForceAtPosition(transform.up * -5.0f, LeftTailAirfoil.position);

            rb.AddForceAtPosition(transform.up * 5.0f, RightTailAirfoil.position);
        }
        //右翻滚
        else if(Input .GetKey (KeyCode .D ))
        {
            rb.AddForceAtPosition(transform.up * 5.0f, LeftTailAirfoil.position);

            rb.AddForceAtPosition(transform.up * -5.0f, RightTailAirfoil.position);
        }
    }
}


2020-03-04 22:30:34 SwordMaster8060 阅读数 73
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Fighter Flight Template是本人开发的一款飞行模拟游戏模板,使用此模板可以帮助您轻松创建您自己的战机游戏


游戏控制

Control On PC

Control On Mobile


模板特点

  • 战机的飞行系统是根据现代战机的空气动力学所设计的。

  • 战机的HUD系统可以自动计算和显示战机当前的 Speed, Altitude, Heading, Pitch Ladder, Horizon Line等参数。

  • 在本模板中你可以一键切换玩家战机类型及外观,其中包括20种美式战机,12种欧式战机,以及8种俄式战机

    如果您想使用您自己的战机模型来改变战机的外观,你只需要按照本模板中说明文档里的步骤进行操作便可轻松切换。

    FighterFlight Template_Switcher.png

  • 包含了两个美丽的大地形,它们是阿尔匹斯山脉和阿塔卡马沙漠。

    每个大地形都由九个小的地形方块所组成,这些小地形方块是由Bing Map导出的地图数据生成的。

  • 游戏模板中的脚本组件的Editor都经过精心设计,外观简洁友好。

  • 详细的说明文档

  • 在战机上所包含的系统:

    -Fighter Center Control System.
    -Fighter Hardware Input System.
    -Fighter Mobile Input System.
    -Fighter Flight System.
    -Fighter Animation System.
    -Fighter HUD System.
    -Fighter Camera System.
    -Fighter Switcher.


在线文档:

Fighter Flight Template Manual


支持Unity的版本

5.6.6 or higher


下载

您可以从Unity Asset Store上进行下载:Fighter Flight Template


更多插件请访问本人的个人网站:

https://www.swordmaster.info/

2015-06-27 14:36:00 weixin_30328063 阅读数 50
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

  使用unity开发游戏真是非常方便。研究飞行模拟也有一段时日,尝试过物理和数学模拟。从效果上来看,物理模拟较为真实一点。但是操作不好。数学模拟的话,虽然牺牲了飞行效果,操控是非常方便的。

  所谓的数学模拟,就是位移模拟,通过定义起飞速度,加速度等,模拟飞机的飞行过程,包括转向,飞行坠落等。

  来看一下飞机的飞行状态:在地面上,飞机达到起飞速度时,可以拉起飞机,否则,一直在地面上;在空中:当飞机低于起飞速度,下降。大于起飞速度则能保持在空中。飞机不可能倒着飞行的,所以,飞机的速度状态就有:起飞速度,正常速度,最大速度。通过输入改变当前速度,然后通过判断速度所对应的状态处理。

  飞机的转向:飞机的转向,有y轴的转向,控制飞机的左右飞行。x的转向,控制飞机的升降。左右飞行时,飞机自身需要以z轴旋转,来模拟飞机转弯的效果。

  飞机的失速:当飞机在空中的速度低于起飞速度时,飞机下落。当着地时,下落的速度为0.

  整理一下思路:可以通过射线检测的方式获取距离地面的高度,判断飞机是在空中还是地面。通过输入值来调整currentSpeed,通过与飞机的offSpeed,normalSpeed,maxSpeed比较,来判断飞机所处的状态。通过四元数方法,调整飞机的角度,保持飞机的平衡和转向时的偏转效果。

  主要使用到的方法:

 

  移动:transform.Translate(vector, Space.World);

  旋转:transform.Rotate(vector, Space.World);

  转角:transform.rotation = Quaternion.RotateTowards(transform.rotation,rotation, speed);

     高度:Physics.Raycast(ray, out hit,1<<0);height = hit.distance;

 

  

  飞机的抽象控制方法:

    public abstract void MoveLR(float speed);//左右移动
    public abstract void RoteUD(float speed);//上下旋转
    public abstract void MoveFB(float speed);//速度控制
    public abstract void RoteLR(float speed);//左右旋转
  public abstract Balance(Quaternion r, float speed);//转角

  public abstract void Operational();//飞行状态
 

  接下来就是飞行方法的实现:

  

public override void MoveFB(float speed)//速度控制
    {
        IsRun = true;//主动控制打开
        CurrentSpeed += speed*aircaft.Acc*Time.deltaTime;//加/减速
        CurrentSpeed = Mathf.Clamp(CurrentSpeed, 0, aircaft.MaxSpeed);//控制速度在最大值范围内
    }
    public override void MoveLR(float speed)//水平移动飞机,飞机的侧飞
    {
        //左右移动
        if ((IsSing) || IsOnGround) return;//如果在地面或者飞机处于特技状态
        //IsLRB = false;
        Vector3 vector = body.right;
        vector.y = 0;

        Move(speed * vector * aircaft.MoveLRSpeed * Time.deltaTime * CurrentSpeed/aircaft.MoveFBSpeed);//侧飞
Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, -aircaft.AxisLR * speed), aircaft.RoteLRSpeed * Time.deltaTime);/旋转机身,实现侧飞的效果 //print("MoveLR" + speed); } public override void Operational()//飞机的状态控制 { Altigraph();//测量高度 if (CurrentSpeed < aircaft.OffSpeed)//小于起飞速度 { //落下 if (!IsOnGround)//在空中 { Move(-Vector3.up * Time.deltaTime * 10 * (1 - CurrentSpeed / (aircaft.OffSpeed)));//失重下落 downSpeed = Mathf.Lerp(downSpeed, 0.1f, Time.deltaTime); //print("downSpeed" + downSpeed); RoteUD(downSpeed);//机身前倾实现下落效果
}
if (!rigidbody) rigidbody = GetComponent<Rigidbody>(); rigidbody.useGravity = IsOnGround;//如果飞机在地面,启用重力,否则不使用重力 } else { downSpeed = 0; } Balance();//保持飞机的平衡 if (!IsRun) {//保持飞机以正常速度飞行 if (CurrentSpeed > aircaft.MoveFBSpeed) CurrentSpeed = Mathf.Lerp(CurrentSpeed, aircaft.MoveFBSpeed,Time.deltaTime); else if (CurrentSpeed > aircaft.OffSpeed && !IsOnGround) CurrentSpeed =Random.Range(aircaft.OffSpeed,aircaft.MoveFBSpeed); else if (IsOnGround && CurrentSpeed < aircaft.OffSpeed) { CurrentSpeed = Mathf.Lerp(CurrentSpeed,0,Time.deltaTime); } } Move(body.forward * CurrentSpeed * Time.deltaTime);//调用飞行方法 } public override void RoteLR(float speed)//飞机的转向 { //左右旋转 if ((IsSing) || IsOnGround) return; IsLRB = false; Rote(speed * Vector3.up * aircaft.RoteLRSpeed * Time.deltaTime * CurrentSpeed / aircaft.MoveFBSpeed); Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y,-aircaft.AxisLR * speed), aircaft.RoteLRSpeed * Time.deltaTime); //print("RoteLR" + speed); } public override void RoteUD(float speed)//飞机的转向 { //上下旋转 //速度和角度 if ((IsSing) || IsOnGround && CurrentSpeed < aircaft.MoveFBSpeed / 3.6f) return; if (CurrentSpeed < aircaft.MoveFBSpeed / 3.6f && speed<0) return; IsFBB = false; Balance(Quaternion.Euler(aircaft.AxisFB * speed, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime * CurrentSpeed / aircaft.MoveFBSpeed); //print("RoteUD" + speed); } public override void Balance()//飞机的平衡方法,当无输入事件时,飞机自动平衡 { if (IsSing) return; if (IsLRB)//z轴平衡(左右) { Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime/1.2f ); } if (IsFBB)//x轴平衡(上下) { Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime /1.3f); } IsLRB = true;//自动平衡打开 IsFBB = true;//自动平衡打开 }

  都是非常简单的代码,关键是如何使用,以及逻辑的处理。

  为了增加飞机飞行的效果,我还设计了飞机的特技飞行:90度转角的左右飞行,以及180度翻转飞行。当然也是使用了基础的公式完成的。左右90度特技飞行:飞机侧身90度,并大角度的转角转向飞机的左或右方。获取相对于飞机在世界坐标的左/右方向V,然后通过判断当前方向与V的角度,来判定是否完成特技飞行。180度转角飞行:飞机绕自身x轴180度旋转,然后恢复平衡。

  因为特技飞行的完成需要一段时间,而这段时间是玩家不需要控制,系统完成后进入正常状态的,所以用到需要协程。

  

IEnumerator SLR(float speed) {
        //90度转角飞行
        speed = (speed > 0 ? 1 : -1);
        Vector3 aim = body.right * (speed);
        aim.y = 0;
        while(Vector3.Dot(aim.normalized,body.forward.normalized)<0.99f){
            Rote(speed * Vector3.up * aircaft.RoteLRSpeed * Time.deltaTime);
            
            Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, -85 * (speed )), aircaft.RoteLRSpeed * Time.deltaTime*3.8f);
            Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime *1.8f);
            yield return new WaitForFixedUpdate();
        }
        while ((body.eulerAngles.z > 15) && (body.eulerAngles.z < 180) || (body.eulerAngles.z < 345) && (body.eulerAngles.z > 270))
        {
            Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime);
            Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime * 3);
            yield return new WaitForFixedUpdate();
        }
        IsSing = false;
    }
    public override void StuntUD(float axis)
    {
        if ((IsSing) || IsOnGround && CurrentSpeed < aircaft.MoveFBSpeed / 3.6f) return;

        if (!IsSing)
        {
            IsSing = true;
            StartCoroutine(SUD(axis));

        }
    }
    IEnumerator SUD(float speed)
    {
        //180度翻转
        speed = (speed > 0 ? 1 : -1);
        Vector3 aim = -body.forward ;
        aim.y = 0;
        while (Vector3.Dot(aim.normalized, body.forward.normalized) < 0.8f)//飞机翻转
        {
            Vector3 v = body.right;
            v.y= 0;
            Rote(body.right * Time.deltaTime * -90 * speed);
            Move(-Vector3.up * speed * Time.deltaTime * 10 * (CurrentSpeed / (aircaft.OffSpeed)));
            //body.Rotate(Vector3.right * Time.deltaTime * -90,Space.Self);
            //Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime*5);
            yield return new WaitForFixedUpdate();
        }
        while ((body.eulerAngles.z > 15) && (body.eulerAngles.z < 180) || (body.eulerAngles.z < 345) && (body.eulerAngles.z >270))//翻转后飞机完成平衡
        {
            Balance(Quaternion.Euler(0, body.eulerAngles.y, body.eulerAngles.z), aircaft.RoteFBSpeed * Time.deltaTime );
            Balance(Quaternion.Euler(body.eulerAngles.x, body.eulerAngles.y, 0), aircaft.RoteLRSpeed * Time.deltaTime*3);
            yield return new WaitForFixedUpdate();
        }
        IsSing = false;
    }

 

  

 

  以上是飞机的飞行模拟思路以及基本算法实现。玩家操作的代码就是输入检测之类的,然后再调用一下飞行接口就行了,我就不提供了。

  接下来的问题就是AI飞行了,由电脑逻辑控制的AI飞行。如上图,是由计算机控制的飞行。这个AI就一个核心方法,就是飞到目标点。要实现这个功能也很简单,就是计算一下目标点的距离,角度等。然后根据距离以及当前状态控制加减速度,通过角度控制转向。主要使用到Vector.Dot(v1,v2);,然后就是各种情况下的判断和飞行方法的调用。例如当目标在飞机的后方时,可以调用180度翻转,来锁定目标。

  好,我们简单的分析一下如何去写这个AI,获取目标Point,计算距离差,高度差,角度差。通过高度差,控制飞机的升降,距离差控制速度,角度差控制转向。

  嗯,下面就是实现的代码。

  

public void MoveToPoint(Vector3 point, float stopDistance) {
        
        Vector3 hPoint = point;
        hPoint.y = flight.body.position.y;
        hDistence = Vector3.Distance(hPoint, flight.body.position);//水平距离
        distence = Vector3.Distance(point, flight.body.position);//距离
        dHeight = point.y - flight.body.position.y;//高度差
        vector = (point - flight.body.position).normalized;
        dUDAgle = Vector3.Dot(vector, flight.body.TransformDirection(Vector3.up).normalized);
        //获取目标点与当前位置的距离,高度差,判断目标相对于当前位置的前/后,左/右
        dFBAgle = Vector3.Dot(vector, (flight.body.TransformDirection(Vector3.forward)).normalized);//判断目标点相对于当前位置的前后
        //print(forward);
        dLRAgle = Vector3.Dot(vector, (flight.body.TransformDirection(Vector3.right)).normalized);//判断目标点相对于当前位置的左右
        
        
        //获取这个信息后,接下来就是移动到目标点
        //先判断什么?正前方到目标点的角度,如果这个角度在一定范围内,则可以进行移动
        //
        float axisFB = 0;
        if (dFBAgle > objectAI.Precision)
        {
            //方向偏移在正常范围内
            //根据距离判断是否加/减速度
            //

            if (distence > objectAI.RunDistance * stopDistance || (flight.CurrentSpeed < flight.aircaft.OffSpeed && !IsLand))
            {
                axisFB = Random.Range(0f, 1f);
            }
            else if (distence > objectAI.FreeDistance * stopDistance && !IsLand)
            {
                axisFB = Random.Range(-0.5f, 0.5f);
            }
            else if (distence < objectAI.SlowDistance * stopDistance && IsLand)
            {
                axisFB = Random.Range(-1f, 0f);
            }
            
        }
        else { 
        //方向偏移不在正常范围
            //判断距离是否达到停止距离
            //判断高度是否在误差之内
            //调整左右和前后,来
            if (distence < stopDistance)
            {
                //到达目标点附近,但是角度偏差过大,判断目标的左右,进行旋转
                axisFB = Random.Range(0.5f, 1f);
                flight.RoteLR(dLRAgle);
            }
            else {
                
                //if (Mathf.Abs(dLRAgle) < 0.05f) dLRAgle = 0;
                if (dFBAgle < -0.75f)
                {
                    flight.StuntUD(flight.Height>100?-1:1);
                }
                else if (dFBAgle < -0.25f) {
                    flight.StuntLR(dLRAgle);
                }
                
                flight.RoteLR(dLRAgle);
                if (!IsLand) {
                    if (Mathf.Abs(dHeight) > 5) {

                        flight.RoteUD(-dUDAgle);
                    }
                    if(flight.IsOnGround){
                        flight.RoteUD(-1);
                    }
                }
                    
                if(flight.CurrentSpeed<flight.aircaft.MoveFBSpeed)
                    axisFB = Random.Range(0.5f, 1f);
            }
        }
        //flight.RoteLR(dLRAgle);
        if (Mathf.Abs(axisFB) > 0.01f)
            flight.MoveFB(axisFB);
    }

  好了,今天的飞行模拟就介绍到这了。预告一下,下一篇文章阿亮将探讨导弹算法的实现(预计目标点位置,而非通过获取目标的当前位置)

  导弹算法已经完成,博客地址:http://www.cnblogs.com/jqg-aliang/p/4768101.html谢谢观看!

本文的链接:http://www.cnblogs.com/jqg-aliang/p/4598515.html。转载请申明出处,谢谢!

转载于:https://www.cnblogs.com/jqg-aliang/p/4598515.html

2018-03-08 00:46:31 5hongbing 阅读数 991
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

目录(?)[+]

今天在看官网Demo的时候,看到一个关于时间轴的例子,正巧之前一直想做一个飞机飞行的例子,正愁不知道弄,现在有思路,赶紧乘热打铁。

先看下实现的效果图:

这里写图片描述

虽然有点瑕疵,但是效果还是可以的。核心就是利用之前说的时间轴来实现,理解掌握这个后就好办了。

初始化

<body>
    <div id="cesiumDemo"></div>
    <script type="text/javascript">
        let view = new Cesium.Viewer('cesiumDemo', {
            baseLayerPicker: false,
            imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
                url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
            }),
            // 阴影是否被太阳投射
            shadows: true
        });
        // 启用地球照明
        view.scene.globe.enableLighting = true;
        // 数据
        let data = [];

        data[0] = [{longitude:116.405419, dimension:39.918034, height:0, time:0},{longitude:116.2821, dimension:39.918145, height:0, time:40},{longitude:115.497402, dimension:39.344641, height:70000, time:100},{longitude:107.942392, dimension:29.559967, height:70000, time:280}, {longitude:106.549265, dimension:29.559967, height:0, time:360}];

        data[1] = [{longitude:116.405419, dimension:39.918034, height:0, time:0},{longitude:117.034586, dimension:39.881202, height:0, time:40},{longitude:116.340088, dimension:38.842224, height:70000, time:100},{longitude:113.489176, dimension:23.464017, height:70000, time:280}, {longitude:113.262084, dimension:23.13901, height:0, time:360}];

        data[2] = [{longitude:118.838979, dimension:32.073514, height:0, time:0},{longitude:118.438838, dimension:32.03777, height:0, time:40},{longitude:117.802406, dimension:31.91231, height:70000, time:100},{longitude:104.043645, dimension:35.993845, height:70000, time:280}, {longitude:101.807224, dimension:36.660972, height:0, time:360}];
   </script>
</body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

因为没有真实数据,就用假的来代替了,坐标点是从百度地图上拾取的。

设置时间轴时间

        // 起始时间
        let start = Cesium.JulianDate.fromDate(new Date(2017,7,11));
        // 结束时间
        let stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());

        // 设置始时钟始时间
        view.clock.startTime = start.clone();
        // 设置时钟当前时间
        view.clock.currentTime = start.clone();
        // 设置始终停止时间
        view.clock.stopTime  = stop.clone();
        // 时间速率,数字越大时间过的越快
        view.clock.multiplier = 10;
        // 时间轴
        view.timeline.zoomTo(start,stop);
        // 循环执行
        view.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

添加坐标到时间轴

        /**
         * 计算飞行
         * @param source 数据坐标
         * @returns {SampledPositionProperty|*}
         */
        function computeFlight(source) {
            // 取样位置 相当于一个集合
            let property = new Cesium.SampledPositionProperty();
            for(let i=0; i<source.length; i++){
                let time = Cesium.JulianDate.addSeconds(start, source[i].time, new Cesium.JulianDate);
                let position = Cesium.Cartesian3.fromDegrees(source[i].longitude, source[i].dimension, source[i].height);
                // 添加位置,和时间对应
                property.addSample(time, position);
            }
            return property;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

添加模型

        for(let j=0; j<data.length; j++){
            let property = computeFlight(data[j]);
            // 添加模型
            let planeModel = view.entities.add({
                // 和时间轴关联
                availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                    start : start,
                    stop : stop
                })]),
                position: property,
                // 根据所提供的速度计算点
                orientation: new Cesium.VelocityOrientationProperty(property),
                // 模型数据
                model: {
                    uri: '../Apps/SampleData/models/CesiumAir/Cesium_Air.glb',
                    minimumPixelSize:128
                }
            });
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

完整代码

<body>
    <div id="cesiumDemo"></div>
    <script type="text/javascript">
        let view = new Cesium.Viewer('cesiumDemo', {
            baseLayerPicker: false,
            imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
                url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
            }),
            // 阴影是否被太阳投射
            shadows: true
        });
        // 启用地球照明
        view.scene.globe.enableLighting = true;

        let data = [];

        data[0] = [{longitude:116.405419, dimension:39.918034, height:0, time:0},{longitude:116.2821, dimension:39.918145, height:0, time:40},{longitude:115.497402, dimension:39.344641, height:70000, time:100},{longitude:107.942392, dimension:29.559967, height:70000, time:280}, {longitude:106.549265, dimension:29.559967, height:0, time:360}];

        data[1] = [{longitude:116.405419, dimension:39.918034, height:0, time:0},{longitude:117.034586, dimension:39.881202, height:0, time:40},{longitude:116.340088, dimension:38.842224, height:70000, time:100},{longitude:113.489176, dimension:23.464017, height:70000, time:280}, {longitude:113.262084, dimension:23.13901, height:0, time:360}];

        data[2] = [{longitude:118.838979, dimension:32.073514, height:0, time:0},{longitude:118.438838, dimension:32.03777, height:0, time:40},{longitude:117.802406, dimension:31.91231, height:70000, time:100},{longitude:104.043645, dimension:35.993845, height:70000, time:280}, {longitude:101.807224, dimension:36.660972, height:0, time:360}];

        // 起始时间
        let start = Cesium.JulianDate.fromDate(new Date(2017,7,11));
        // 结束时间
        let stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());

        // 设置始时钟始时间
        view.clock.startTime = start.clone();
        // 设置时钟当前时间
        view.clock.currentTime = start.clone();
        // 设置始终停止时间
        view.clock.stopTime  = stop.clone();
        // 时间速率,数字越大时间过的越快
        view.clock.multiplier = 10;
        // 时间轴
        view.timeline.zoomTo(start,stop);
        // 循环执行
        view.clock.clockRange = Cesium.ClockRange.LOOP_STOP;

        for(let j=0; j<data.length; j++){
            let property = computeFlight(data[j]);
            // 添加模型
            let planeModel = view.entities.add({
                // 和时间轴关联
                availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                    start : start,
                    stop : stop
                })]),
                position: property,
                // 根据所提供的速度计算点
                orientation: new Cesium.VelocityOrientationProperty(property),
                // 模型数据
                model: {
                    uri: '../Apps/SampleData/models/CesiumAir/Cesium_Air.glb',
                    minimumPixelSize:128
                }
            });
        }


            /**
             * 计算飞行
             * @param source 数据坐标
             * @returns {SampledPositionProperty|*}
             */
            function computeFlight(source) {
                // 取样位置 相当于一个集合
                let property = new Cesium.SampledPositionProperty();
                for(let i=0; i<source.length; i++){
                    let time = Cesium.JulianDate.addSeconds(start, source[i].time, new Cesium.JulianDate);
                    let position = Cesium.Cartesian3.fromDegrees(source[i].longitude, source[i].dimension, source[i].height);
                    // 添加位置,和时间对应
                    property.addSample(time, position);
                }
                return property;
            }
    </script>
</body>
没有更多推荐了,返回首页