Unity引擎开发-无人机模拟飞行实现

Posted biyezuopinvip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity引擎开发-无人机模拟飞行实现相关的知识,希望对你有一定的参考价值。

目 录
摘 要 I
Abstract II
一、 绪论 1
(一) 研究背景和研究意义 1
(二) 国内外研究现状 1
(三) 论文组织结构 2
二、 3D游戏技术的知识系统 2
(一) 3D图形库 2
(二) 物理引擎 5
(三) Unity3D 8
三、 无人机模拟飞行游戏的设计 11
(一) 游戏创意 11
(二) 游戏框架结构设计 13
(三) 游戏层次结构设计 14
四、 无人机模拟飞行游戏的实现 15
(一) 场景渲染实现 15
(二) 场景物理仿真实现 21
(三) 无人机动力学模拟 22
(四) 用户图形界面实现 24
(五) 网络联机模块实现 27
五、 游戏展示与性能分析 28
(一) 游戏展示 28
(二) 性能分析 30
六、 项目总结 32
(一) 总结 32
(二) 下一步工作的展望 33
参考文献 34
二、3D游戏技术的知识系统
(一)3D图形库
1.3D图形库简介
3D图形库被定义为显卡与应用程序直接的接口。编程人员只要调用3D图形库中的API(Application Programming Interface)函数,从而与硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,制作具有3D图形效果的软件。
3D图形库的执行具有非常快速的特点,并且具有高度的可移植性,其中的API函数定义为独立于任何程序设计语言的一组规范,在特定语言中的实现描述由国际标准化组织来制定。严格按照计算机图形学原理设计而成,符合光学和视觉原理,编程人员只要用这些API函数定义点、线、面的三维特征,如位置坐标、顶点颜色、法向向量、纹理坐标等就可以创建极其逼真的3D图像。许多三维演示系统都用3D图形库作为三维图形生成和控制的编程接口。目前主要应用的3D函数库有DirectX和OpenGL。
DirectX:微软公司专为PC游戏开发的API,与Windows操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度,而且目前基本上是免费使用的。由于要考虑与各方面的兼容性,DirectX用起来比较麻烦、在执行效率上也未见得最优。
OpenGL:(开放式图形接口)由Silicon Graphics公司开发,能够在Windows 95、Windows NT、Macos、Beos、OS/2、以及Unix上应用的API。由于OpenGL起步较早,一直用于高档图形工作站,其3D图形功能很强,超过DirectX,能最大限度地发挥3D芯片的巨大潜力。在Windows中已经全面支持DirectX和OpenGL。在OpenGL的1.2版中还增加了对3DNow!标准的支持。

2.3D图形库的渲染管线
绝大多数3D图形库实现都有相似操作顺序,一系列相关的处理阶段叫做3D图形的渲染管线,如图2-1显示了这些顺序,它是3D图形库处理数据的方法[3]。

图2-1 3D图形库渲染管线
下面详细介绍其中几个比较重要的阶段:
基于顶点的操作与基本装配:这个过程包括本地空间-世界空间-视图空间-背面拣选,主要是根据编程人员设置的摄像机位置、视锥属性和顶点索引对顶点数据进行一系列的数学运算,使3D图形的形状及位置得以正确显示。
像素操作:该过程主要根据编程人员传入显卡的纹理及顶点的纹理坐标以及光照信息进行颜色计算、混合,并对线、面采用线性插值、二次线性插值等算法最终进行出像素的颜色。这个过程的计算一般由显卡固定管线的计算公式完成,如想得到更真实、更多样的效果,可采用可编程管线技术实现。










Dji Mobile SDK 基础实现

  

Dji Mobile SDK 基础实现(一)

本文简要介绍如何通过调用DJI Mobile SDK,实现获取和释放无人机的控制权限模拟遥控器按钮控制无人机的飞行获取无人机的回传视频获取无人机参数实现和onboard SDK的数据透传

下面逐个介绍以上内容,余下内容将在以后的文章介绍(文章末尾附上GitHub链接):

  • 获取和释放权限
  • 模拟遥控器按钮控制无人机的飞行

获取和释放权限


1、获取flightController 对象;

DJIFlightController flightController;
//对flightController进行实例化
public void setAircraft(DJIBaseProduct djiAircraft){
        if(djiAircraft==null){

            return;
        }
        flightController=((DJIAircraft)djiAircraft).getFlightController();
        if(flightController!=null) {

        }

    }

2、通过flightController对象调用方法获取和释放无人机的权限:

//获取无人机的控制权限
    public void enable(){
    flightController.enableVirtualStickControlMode(
                new DJIBaseComponent.DJICompletionCallback() {
                    @Override
                    public void onResult(DJIError djiError) {
                        if (djiError == null) {

                        }
                    }
                }
        );
        if(mSendVirtualStickDataTimer==null) {
            mSendVirtualStickDataTimer = new Timer();
            mSendVirtualStickDataTimer.schedule(new MyTimerTask(this), 100, 200);
        }
        isEnable=true;
        VirtualStickApplication.logInfo("已获取对无人的控制权限!");
    }
    //释放无人机的控制权限
    public void disable(){
        isEnable=false;
        flightController.disableVirtualStickControlMode(
                new DJIBaseComponent.DJICompletionCallback() {
                    @Override
                    public void onResult(DJIError djiError) {
                        if (djiError == null)
                        {

                        }
                    }
                }
        );
        if(taskReference!=null) {
            taskReference.cancel();
            taskReference=null;
        }
        if(mSendVirtualStickDataTimer!=null) {
            mSendVirtualStickDataTimer.cancel();
            mSendVirtualStickDataTimer.purge();
            mSendVirtualStickDataTimer=null;
        }
    }

模拟遥控器按钮控制无人机的飞行


1、获取flightController 对象(如上所示); 
2、通过flightController对象调用方法实现无人机的起飞、降落、上升、下降、左旋、右旋以及往前后左右四个方向飞行; 
起飞

//实现无人机的起飞操作
    public void takeOff(){
       if(flightController instanceof dji.sdk.FlightController.c){
           dji.sdk.FlightController.c tmp=(dji.sdk.FlightController.c)flightController;
           tmp.takeOff(new DJIBaseComponent.DJICompletionCallback() {
               @Override
               public void onResult(DJIError djiError) {
                   if (djiError != null)
                       VirtualStickApplication.logError("TakeOff error:", djiError);
               }
           });
           VirtualStickApplication.logInfo("无人机开始起飞!");
        }
    }

降落

//实现无人机的降落
    public void land(){
        if(flightController instanceof dji.sdk.FlightController.c){
            dji.sdk.FlightController.c tmp=(dji.sdk.FlightController.c)flightController;
            tmp.autoLanding(new DJIBaseComponent.DJICompletionCallback() {
                                @Override
                                public void onResult(DJIError djiError) {
                                    if (djiError != null)
                                        VirtualStickApplication.logError("AutoLanding error:", djiError);
                                }
                            }
            );
            VirtualStickApplication.logInfo("无人机开始降落!");
        }
    }

上升

public void leftUpClick(){
        if(mThrottle<6)
            mThrottle++;
    }

下降

public void leftDownClick(){
        if(mThrottle>=1)
             mThrottle--;

    }

左旋

public void leftLeftClick(){
        mYaw= -yawSpeed;
    }

右旋

public void leftRightClick(){
        mYaw= yawSpeed;
    }

前行

public void rightUpClick(){
        mRoll =rollPitchSpeed;
    }

后退

public void rightRightClick(){
        mPitch =rollPitchSpeed;
    }

左行

 public void rightDownClick(){
        mRoll =-rollPitchSpeed;
    }

右行

 public void rightLeftClick(){
        mPitch=-rollPitchSpeed;
    }

其中,获取和释放权限、起飞、降落函数推荐在onclick事件中进行调用,控制无人机飞行的函数推荐在OnTouch事件中进行调用(也可利用自己写Timer控制每个函数的执行时间等)。


Github链接:https://github.com/MrJoeyM/sky-app

以上是关于Unity引擎开发-无人机模拟飞行实现的主要内容,如果未能解决你的问题,请参考以下文章

蓝鸥Unity开发基础三课时14 刚体

unity游戏开发看什么书?

使用Photon引擎进行unity网络游戏开发

Unity游戏引擎都有哪些优势

制作简单汽车游戏

Unity游戏中的子弹碰撞体实现逻辑漫谈