Unity使用物理引擎實(shí)現(xiàn)多旋翼無人機(jī)的模擬飛行
內(nèi)容簡介
最近在用Unity實(shí)現(xiàn)無人機(jī)的模擬飛行,但發(fā)現(xiàn)站里基本沒有完整介紹如何實(shí)現(xiàn)該功能的博客,因時(shí)間緊迫,就自己簡單做了一個(gè)仿真(不是完全按照現(xiàn)實(shí)物理情景來做,即通過各個(gè)螺旋槳旋轉(zhuǎn)產(chǎn)生力帶動(dòng)機(jī)體飛行)。下面我會(huì)簡述完全按現(xiàn)實(shí)物理情景實(shí)現(xiàn)模擬飛行,并詳細(xì)描述我自己做的模擬飛行(不完全仿真),給各位提供參考。
現(xiàn)實(shí)物理情景的實(shí)現(xiàn)——簡述(以四旋翼無人機(jī)為例)
因?yàn)槲覜]有實(shí)現(xiàn)1:1仿真,所以這里只介紹思路,希望能給到讀者一點(diǎn)啟發(fā)。
- 構(gòu)建一個(gè)四旋翼無人機(jī)模型(可以網(wǎng)上下載?;蛴肕aya等建一個(gè))
- 將模型設(shè)置為Rigidbody和BoxCollider(即實(shí)現(xiàn)一個(gè)物理模型,記得要先Create一個(gè)Plane承住你的模型)
- 給四個(gè)螺旋槳各寫一個(gè)腳本,各產(chǎn)生一個(gè)向上的力
- 通過螺旋槳產(chǎn)生的升力即可帶動(dòng)模型飛行,通過控制不同螺旋槳產(chǎn)生升力的不同,即可實(shí)現(xiàn)無人機(jī)的各種飛行姿態(tài)(這步是最難的,也最花時(shí)間)
簡化物理情景的實(shí)現(xiàn)——詳述(以四旋翼無人機(jī)為例)
背景:上面的現(xiàn)實(shí)模擬最麻煩之處在于要對(duì)四個(gè)螺旋槳(電機(jī))實(shí)現(xiàn)控制并達(dá)到平衡,太麻煩了,調(diào)試要很久,網(wǎng)上又沒有現(xiàn)成的代碼(至少免費(fèi)的我沒有發(fā)現(xiàn))。所以我自己簡化了一下模型,并實(shí)現(xiàn)所需功能。
思路:簡化模型的區(qū)別在于我不用四個(gè)螺旋槳(電機(jī))來各自產(chǎn)生升力,形成合力來帶動(dòng)機(jī)體。而是直接將力加在機(jī)身上,即跳過了前面那一步,直接用合力來實(shí)現(xiàn)無人機(jī)的飛行。
實(shí)現(xiàn)步驟:以下為實(shí)現(xiàn)步驟,考慮到網(wǎng)上好像沒有相關(guān)的博客和視頻教程,我會(huì)盡量詳細(xì)來敘述,所以會(huì)有點(diǎn)多。
1.導(dǎo)入一個(gè)無人機(jī)模型,并給整體設(shè)置Rigidbody和BoxCollider(注意最好Collider設(shè)成和模型差不多大)。
2. 寫腳本1(Plane_Text)(總共需要寫兩個(gè)腳本,記為腳本1和腳本2),腳本1使其產(chǎn)生力帶動(dòng)機(jī)體運(yùn)動(dòng)
using System.Collections; using System.Collections.Generic; using System.IO.Pipes; using System.Runtime.CompilerServices; using System.Security.Cryptography.X509Certificates; using UnityEngine; using UnityEngine.UI; public class Plane_Text : MonoBehaviour { private Rigidbody m_Rigidbody; public float speed = 5; public float angle = 0; private float x, y, z; public Transform target; void Start() { m_Rigidbody = gameObject.GetComponent<Rigidbody>();//獲取組件 } void Update() { var vec = new Vector3(x, y, z); m_Rigidbody.AddForce(vec * speed, ForceMode.Force);//無人機(jī)朝vec向量方向運(yùn)動(dòng),至于vec的取值由下面各個(gè)按鍵確定 /*******無人機(jī)飛機(jī)控制*********/ /*******W加油門(上升);S減油門(下降);A左轉(zhuǎn);D右轉(zhuǎn)*********/ if (Input.GetKeyUp(KeyCode.W)) speed++; if (Input.GetKeyDown(KeyCode.W)) x = 0;y = 1;z = 0; if (Input.GetKeyUp(KeyCode.S)) speed--; if (Input.GetKeyDown(KeyCode.D)) angle++; this.transform.Rotate(Vector3.up * angle);//按下D鍵則一直右轉(zhuǎn),下同 if (Input.GetKeyUp(KeyCode.D)) angle = 0; this.transform.Rotate(Vector3.up * angle);//松開D鍵停止右轉(zhuǎn),下同 if (Input.GetKeyDown(KeyCode.A)) angle--; this.transform.Rotate(Vector3.up * angle); if (Input.GetKeyUp(KeyCode.A)) angle = 0; this.transform.Rotate(Vector3.up * angle); /*******↑前傾;↓后傾;←左傾;→右傾*********/ if (Input.GetKeyDown(KeyCode.LeftArrow))//按下←鍵朝向量(-1,2,0)方向運(yùn)動(dòng),即左傾,但該左傾只是運(yùn)動(dòng)軌跡上左傾,模型是不會(huì)往左傾的,所以需要下腳本2里設(shè)置 x = -1; y = 2; z = 0; //這個(gè)取值隨你定,但x一定是負(fù)的且z一定是0,至于x和y的大小就看你想飛行軌跡左傾多少來決定了 if (Input.GetKeyUp(KeyCode.LeftArrow))//當(dāng)松開←鍵時(shí),不再左傾,而是按原來(0,1,0)方向,即y軸向上,繼續(xù)移動(dòng) x = 0; y = 1; z = 0;//同樣因?yàn)槭莥軸,x和z的值必須為0,y的值看你心情 /**************************************************/ if (Input.GetKeyDown(KeyCode.RightArrow))//按下→鍵 x = 1; y = 2; z = 0; //這些我就不再解釋了,跟上面“←鍵”的是一樣的,只是傾斜方向不一樣而已 if (Input.GetKeyUp(KeyCode.RightArrow)) x = 0; y = 1; z = 0; /**************************************************/ if (Input.GetKeyDown(KeyCode.UpArrow))//按下↑鍵 x = 0;y = 2;z = 1; if (Input.GetKeyUp(KeyCode.UpArrow)) x = 0; y = 1; z = 0; /**************************************************/ if (Input.GetKeyDown(KeyCode.DownArrow))//按下↓鍵 x = 0;y = 2;z = -1; if (Input.GetKeyUp(KeyCode.DownArrow)) x = 0; y = 1; z = 0; /**************************************************/ } }
3.寫腳本2(Plane_Move):該腳本是用來實(shí)現(xiàn)模型的前后左右傾的
using System.Collections; using System.Collections.Generic; using System.IO.Pipes; using System.Runtime.CompilerServices; using System.Security.Cryptography.X509Certificates; using UnityEngine; using UnityEngine.UI; public class Plane_Move : MonoBehaviour { private Rigidbody m_Rigidbody; void Start() { m_Rigidbody = gameObject.GetComponent<Rigidbody>();//獲取組件 } void Update() { /*******↑前傾;↓后傾;←左傾;→右傾*********/ if (Input.GetKeyDown(KeyCode.LeftArrow)) transform.rotation = Quaternion.Euler(0, 0, 10);//繞z軸轉(zhuǎn)10°,即左傾,不一定是10,看你想傾多少就傾多少,別太大就行,下同 if (Input.GetKeyUp(KeyCode.LeftArrow)) transform.rotation = Quaternion.Euler(0, 0, 0);//松開按鍵恢復(fù)豎直向上飛,下同 /**************************************************/ if (Input.GetKeyDown(KeyCode.RightArrow)) this.transform.rotation = Quaternion.Euler(0, 0, -10); if (Input.GetKeyUp(KeyCode.RightArrow)) this.transform.rotation = Quaternion.Euler(0, 0, 0); /**************************************************/ if (Input.GetKeyDown(KeyCode.UpArrow)) this.transform.rotation = Quaternion.Euler(10, 0, 0); if (Input.GetKeyUp(KeyCode.UpArrow)) this.transform.rotation = Quaternion.Euler(0, 0, 0); /**************************************************/ if (Input.GetKeyDown(KeyCode.DownArrow)) this.transform.rotation = Quaternion.Euler(-10, 0, 0); if (Input.GetKeyUp(KeyCode.DownArrow)) this.transform.rotation = Quaternion.Euler(0, 0, 0); /**************************************************/ } }
4.完成上面3步,我們就會(huì)得到兩個(gè)腳本
5.然后就是把這兩個(gè)腳本拖到無人機(jī)上(注意兩個(gè)都要拖?。又褪沁\(yùn)行了(如果是運(yùn)行不了肯定是你復(fù)制了我的代碼,但腳本名又和我不一樣的緣故)
6.最后運(yùn)行成功(原諒我不會(huì)截動(dòng)圖給你們看運(yùn)行結(jié)果)
7.當(dāng)然有人會(huì)說螺旋槳怎么不會(huì)轉(zhuǎn)啊,這也簡單;首先給四個(gè)螺旋槳的頂點(diǎn)各建一個(gè)空物體(每個(gè)螺旋槳要繞著它對(duì)應(yīng)的空物體旋轉(zhuǎn)),然后再寫一個(gè)腳本(Power_all),我這里就不區(qū)分正反槳了。(你要區(qū)分也行,就是把Vector3.down改成Vector3.up就是另一對(duì)槳)
using System.Collections.Generic; using System.Collections; using System.Globalization; using UnityEngine; using System; using UnityEngine.UI; //using UnityEngine.Debug; public class Power_all : MonoBehaviour { public GameObject target01;//聲明頂點(diǎn) private float n = 10; // Update is called once per frame void Update() { this.transform.RotateAround(target01.transform.position, Vector3.down, 100f * n * Time.deltaTime);//該函數(shù)通過放入一個(gè)頂點(diǎn),以及圍繞這個(gè)頂點(diǎn)要旋轉(zhuǎn)的x軸并給定旋轉(zhuǎn)速度 //Vector3向量,在三維坐標(biāo)系中帶有方向和大小的數(shù)據(jù),Vector3.up=(0,1,0)、Vector3.down=(0,-1,0)、Vector3.left=(-1,0,0)、Vector3.right=(1,0,0) } }
8.將上面這個(gè)螺旋槳的腳本分別拖到各個(gè)槳葉模型上,然后將各個(gè)空物體拉到各個(gè)聲明的頂點(diǎn)處即可。
9.上述即完成了簡化的多旋翼無人機(jī)模擬飛行??赡苡腥藭?huì)說我第2、3點(diǎn)誰規(guī)定了只能前傾一個(gè)角度,其實(shí)我是這樣理解的,如果按照現(xiàn)實(shí)情景來完全模擬,確實(shí)前傾任意角度,甚至是180°,但前傾角度過大導(dǎo)致的結(jié)果是墜機(jī),所以我設(shè)置在10°可以理解為安全傾角,當(dāng)然你也可以自己該代碼來實(shí)現(xiàn)自己想要的功能,我這里只是提供一個(gè)參考。
以上就是Unity使用物理引擎實(shí)現(xiàn)多旋翼無人機(jī)的模擬飛行的詳細(xì)內(nèi)容,更多關(guān)于Unity實(shí)現(xiàn)無人機(jī)飛行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 在unity腳本中控制Inspector面板的參數(shù)操作
- C#中public變量不能被unity面板識(shí)別的解決方案
- 在Unity中使用全局變量的操作
- unity 切換場景不銷毀物體問題的解決
- Unity 靜態(tài)變量跨場景操作
- Unity3D 單例模式和靜態(tài)類的使用詳解
- Unity 讀取文件 TextAsset讀取配置文件方式
- 解決在Unity中使用FairyGUI遇到的坑
- Unity3d 如何更改Button的背景色
- Unity3d使用FairyGUI 自定義字體的操作
- Unity3D運(yùn)行報(bào)DllNotFoundException錯(cuò)誤的解決方案
- Unity游戲之存儲(chǔ)數(shù)據(jù)
相關(guān)文章
C#創(chuàng)建一個(gè)可快速重復(fù)使用的項(xiàng)目模板(詳細(xì)過程)
這篇文章主要介紹了C#如何創(chuàng)建一個(gè)可快速重復(fù)使用的項(xiàng)目模板今天給大家介紹的是基于官方的cli donet new 命令創(chuàng)建自己的項(xiàng)目模板,需要的朋友可以參考下2024-06-06C#實(shí)現(xiàn)提取Word中插入的多媒體文件(視頻,音頻)
在Word中可將文件通過OLE對(duì)象嵌入的方式插入到文檔,包括Word、excel、PDF、PPT、圖片、宏文件、文件包等在內(nèi)的多種文件類型。本文將利用C#實(shí)現(xiàn)提取插入在Word文件中的這些多媒體文件,感興趣的可以了解一下2022-02-02C#?微信支付回調(diào)驗(yàn)簽處理的實(shí)現(xiàn)
在微信支付中,當(dāng)用戶支付成功后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,本文就詳細(xì)的介紹了C#?微信支付回調(diào)驗(yàn)簽處理,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法
這篇文章介紹了C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07基于動(dòng)態(tài)修改App.Config與web.Config的使用詳解
本篇文章是對(duì)動(dòng)態(tài)修改App.Config與web.Config的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Unity shader實(shí)現(xiàn)百葉窗特效
這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)百葉窗特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11C#實(shí)現(xiàn)為類和函數(shù)代碼自動(dòng)添加版權(quán)注釋信息的方法
這篇文章主要介紹了C#實(shí)現(xiàn)為類和函數(shù)代碼自動(dòng)添加版權(quán)注釋信息的方法,主要涉及安裝文件的修改及函數(shù)注釋模板的修改,需要的朋友可以參考下2014-09-09c# EPPlus秘籍之Excel實(shí)現(xiàn)圖表導(dǎo)出
這篇文章主要為大家介紹了c# EPPlus秘籍之Excel實(shí)現(xiàn)圖表導(dǎo)出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12