最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity使用物理引擎實現(xiàn)多旋翼無人機(jī)的模擬飛行

 更新時間:2021年04月14日 10:04:05   作者:weixin_44411555  
這篇文章主要介紹了Unity使用物理引擎實現(xiàn)多旋翼無人機(jī)的模擬飛行,包括了詳細(xì)的原理介紹和代碼實現(xiàn),對物理引擎感興趣的同學(xué),可以參考下

內(nèi)容簡介

最近在用Unity實現(xiàn)無人機(jī)的模擬飛行,但發(fā)現(xiàn)站里基本沒有完整介紹如何實現(xiàn)該功能的博客,因時間緊迫,就自己簡單做了一個仿真(不是完全按照現(xiàn)實物理情景來做,即通過各個螺旋槳旋轉(zhuǎn)產(chǎn)生力帶動機(jī)體飛行)。下面我會簡述完全按現(xiàn)實物理情景實現(xiàn)模擬飛行,并詳細(xì)描述我自己做的模擬飛行(不完全仿真),給各位提供參考。

現(xiàn)實物理情景的實現(xiàn)——簡述(以四旋翼無人機(jī)為例)

因為我沒有實現(xiàn)1:1仿真,所以這里只介紹思路,希望能給到讀者一點啟發(fā)。

  1. 構(gòu)建一個四旋翼無人機(jī)模型(可以網(wǎng)上下載?;蛴肕aya等建一個)
  2. 將模型設(shè)置為Rigidbody和BoxCollider(即實現(xiàn)一個物理模型,記得要先Create一個Plane承住你的模型)
  3. 給四個螺旋槳各寫一個腳本,各產(chǎn)生一個向上的力
  4. 通過螺旋槳產(chǎn)生的升力即可帶動模型飛行,通過控制不同螺旋槳產(chǎn)生升力的不同,即可實現(xiàn)無人機(jī)的各種飛行姿態(tài)(這步是最難的,也最花時間)

簡化物理情景的實現(xiàn)——詳述(以四旋翼無人機(jī)為例)

背景:上面的現(xiàn)實模擬最麻煩之處在于要對四個螺旋槳(電機(jī))實現(xiàn)控制并達(dá)到平衡,太麻煩了,調(diào)試要很久,網(wǎng)上又沒有現(xiàn)成的代碼(至少免費的我沒有發(fā)現(xiàn))。所以我自己簡化了一下模型,并實現(xiàn)所需功能。
思路:簡化模型的區(qū)別在于我不用四個螺旋槳(電機(jī))來各自產(chǎn)生升力,形成合力來帶動機(jī)體。而是直接將力加在機(jī)身上,即跳過了前面那一步,直接用合力來實現(xiàn)無人機(jī)的飛行。
實現(xiàn)步驟:以下為實現(xiàn)步驟,考慮到網(wǎng)上好像沒有相關(guān)的博客和視頻教程,我會盡量詳細(xì)來敘述,所以會有點多。

1.導(dǎo)入一個無人機(jī)模型,并給整體設(shè)置Rigidbody和BoxCollider(注意最好Collider設(shè)成和模型差不多大)。

2. 寫腳本1(Plane_Text)(總共需要寫兩個腳本,記為腳本1和腳本2),腳本1使其產(chǎn)生力帶動機(jī)體運動

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向量方向運動,至于vec的取值由下面各個按鍵確定
		/*******無人機(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)方向運動,即左傾,但該左傾只是運動軌跡上左傾,模型是不會往左傾的,所以需要下腳本2里設(shè)置
			x = -1; y = 2; z = 0; //這個取值隨你定,但x一定是負(fù)的且z一定是0,至于x和y的大小就看你想飛行軌跡左傾多少來決定了
		if (Input.GetKeyUp(KeyCode.LeftArrow))//當(dāng)松開←鍵時,不再左傾,而是按原來(0,1,0)方向,即y軸向上,繼續(xù)移動
			x = 0; y = 1; z = 0;//同樣因為是y軸,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):該腳本是用來實現(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步,我們就會得到兩個腳本

5.然后就是把這兩個腳本拖到無人機(jī)上(注意兩個都要拖?。?,接著就是運行了(如果是運行不了肯定是你復(fù)制了我的代碼,但腳本名又和我不一樣的緣故)

6.最后運行成功(原諒我不會截動圖給你們看運行結(jié)果)

7.當(dāng)然有人會說螺旋槳怎么不會轉(zhuǎn)啊,這也簡單;首先給四個螺旋槳的頂點各建一個空物體(每個螺旋槳要繞著它對應(yīng)的空物體旋轉(zhuǎn)),然后再寫一個腳本(Power_all),我這里就不區(qū)分正反槳了。(你要區(qū)分也行,就是把Vector3.down改成Vector3.up就是另一對槳)

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;//聲明頂點
	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ù)通過放入一個頂點,以及圍繞這個頂點要旋轉(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.將上面這個螺旋槳的腳本分別拖到各個槳葉模型上,然后將各個空物體拉到各個聲明的頂點處即可。

9.上述即完成了簡化的多旋翼無人機(jī)模擬飛行。可能有人會說我第2、3點誰規(guī)定了只能前傾一個角度,其實我是這樣理解的,如果按照現(xiàn)實情景來完全模擬,確實前傾任意角度,甚至是180°,但前傾角度過大導(dǎo)致的結(jié)果是墜機(jī),所以我設(shè)置在10°可以理解為安全傾角,當(dāng)然你也可以自己該代碼來實現(xiàn)自己想要的功能,我這里只是提供一個參考。

以上就是Unity使用物理引擎實現(xiàn)多旋翼無人機(jī)的模擬飛行的詳細(xì)內(nèi)容,更多關(guān)于Unity實現(xiàn)無人機(jī)飛行的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#使用oledb讀取excel表格內(nèi)容到datatable的方法

    C#使用oledb讀取excel表格內(nèi)容到datatable的方法

    這篇文章主要介紹了C#使用oledb讀取excel表格內(nèi)容到datatable的方法,涉及C#操作oledb及datatable的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C# 郵箱mail 發(fā)送類

    C# 郵箱mail 發(fā)送類

    此類的功能包括發(fā)送郵件,郵箱格式是否正確,和在不發(fā)送郵件的情況下判斷郵箱用戶名和密碼是否正確,鑒于POP檢查郵箱用戶名和密碼出現(xiàn)錯誤情況返回結(jié)果的延遲,用異步線程解決此問題,見代碼
    2015-06-06
  • C#中Dictionary類使用實例

    C#中Dictionary類使用實例

    這篇文章主要介紹了C#中Dictionary類使用實例,本文直接給出一個使用實例,包含一些Dictionary的基本用法,需要的朋友可以參考下
    2015-06-06
  • C#實現(xiàn)懸浮窗口的方法詳解

    C#實現(xiàn)懸浮窗口的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何實現(xiàn)懸浮窗口的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • C#實現(xiàn)基于Base64的加密解密類實例

    C#實現(xiàn)基于Base64的加密解密類實例

    這篇文章主要介紹了C#實現(xiàn)基于Base64的加密解密類,實例分析了C#基于Base64的加密解密實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#使用oledb操作excel文件的方法

    C#使用oledb操作excel文件的方法

    這篇文章主要介紹了C#使用oledb操作excel文件的方法,涉及C#中oledb操作excel的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • C# 連接SQL數(shù)據(jù)庫的方法及常用連接字符串

    C# 連接SQL數(shù)據(jù)庫的方法及常用連接字符串

    這篇文章主要介紹了C# 連接SQL數(shù)據(jù)庫的方法及常用連接字符串,有需要的朋友可以參考一下
    2014-01-01
  • C#自定義控件VS用戶控件

    C#自定義控件VS用戶控件

    這篇文章主要為大家詳細(xì)介紹了C#中自定義控件VS用戶控件的區(qū)別,介紹了開發(fā)自己的控件的幾種方法、自定義控件與用戶控件區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • c# Winform自定義控件-儀表盤功能

    c# Winform自定義控件-儀表盤功能

    這篇文章主要介紹了c#Winform自定義控件-儀表盤功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • C#實現(xiàn)CSV文件讀寫的示例詳解

    C#實現(xiàn)CSV文件讀寫的示例詳解

    這篇文章主要介紹了CsvHelper、TextFieldParser、正則表達(dá)式三種解析CSV文件的方法,順帶也會介紹一下CSV文件的寫方法,需要的可以參考一下
    2023-05-05

最新評論

阿图什市| 宾阳县| 香港 | 南平市| 安庆市| 遂宁市| 隆尧县| 清流县| 措勤县| 永城市| 东源县| 潢川县| 出国| 合山市| 郁南县| 天峨县| 江城| 子洲县| 疏附县| 惠安县| 东方市| 威信县| 托克逊县| 青州市| 安顺市| 富阳市| 和硕县| 小金县| 武陟县| 二连浩特市| 富民县| 武定县| 枞阳县| 甘孜县| 康乐县| 宁安市| 唐海县| 和顺县| 宁化县| 溧水县| 平阴县|