• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • #unity##HTC VIVE#實現簡單的無人機操作模擬

    標簽: unity  vr

    為了在我們的VR項目中增添有用功能,就添加了這個模塊。

    無人機的操控是模擬現實無人機的雙搖桿手柄操作方式,對htc vive兩個手柄的touchpad的功能進行繼承重寫,實現操控:


    如圖,左touchpad分成四個區域,根據touchpad的觸摸檢測觸碰位置的區域,同時根據按壓touchpad來執行操控。分別對應的:水平軸左右轉向,以及豎直軸上升下降。

    而右touchpad根據觸摸位置相對圓中心的向量方向,來控制飛行器水平面上的位移方向,為了效果更真實,還設置了加速度。

    下面來看一下代碼:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Flying : MonoBehaviour {
    
    	public bool IsFlying = false;
    
    	public GameObject leftController;
    	public GameObject rightController;
    
    	public float maxVelocityXZ=2.0f;
    	public float velocityY=1.0f;
    	public float accelerationXZ=10.0f;
    
    	private float velocityXZ=0;
    
    	SteamVR_TrackedObject trackedLeft;
    	SteamVR_TrackedObject trackedRight;
    	Vector3 right;
    
    	void Awake(){
    		trackedLeft = leftController.GetComponent<SteamVR_TrackedObject> ();
    		trackedRight = rightController.GetComponent<SteamVR_TrackedObject> ();
    	}
    	// Use this for initialization
    	void Start () {
    
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		var deviceLeft = SteamVR_Controller.Input ((int)trackedLeft.index);
    		var deviceRight = SteamVR_Controller.Input ((int)trackedRight.index);
    		if (IsFlying == true) {
    			
    			if(deviceLeft.GetPress(SteamVR_Controller.ButtonMask.Touchpad)){
    				Vector2 left = deviceLeft.GetAxis ();
    				float angle = VectorAngle (new Vector2 (1, 0), left);
    				if (angle > 45 && angle < 135) {//上
    					transform.Translate (Vector3.down * velocityY*Time.deltaTime);
    				}
    				if(angle<-45&&angle>-135){//下
    					transform.Translate (Vector3.up * velocityY*Time.deltaTime);
    				}
    				if((angle<180&&angle>135)||(angle<-135&&angle>-180)){
    					transform.Rotate (Vector3.down * Time.deltaTime*150);
    				}
    				if ((angle < 45 && angle > 0) || (angle <0 && angle > -45)) {
    					transform.Rotate (Vector3.up * Time.deltaTime*150);
    				}
    			}
    			if(deviceRight.GetPress(SteamVR_Controller.ButtonMask.Touchpad)){
    				if (velocityXZ < maxVelocityXZ) {
    					velocityXZ += accelerationXZ * Time.deltaTime;
    				}
    				Vector2 rightTouchPad = deviceRight.GetAxis ();
    				right = new Vector3 (rightTouchPad.x,0, rightTouchPad.y);
    				transform.Translate (velocityXZ * Time.deltaTime * right.normalized);
    			}
    			if(velocityXZ>0&&!deviceRight.GetPress(SteamVR_Controller.ButtonMask.Touchpad)){
    				velocityXZ -= accelerationXZ * Time.deltaTime;
    				transform.Translate (velocityXZ * Time.deltaTime * right.normalized);
    			}
    			//transform.Rotate (Vector3.Cross (Vector3.up, right) * velocityXZ,Space.World);
    
    	}
    
    	}
    
    		float VectorAngle(Vector2 from, Vector2 to)
    	{  
    		float angle;  
    		Vector3 cross = Vector3.Cross(from, to);  
    		angle = Vector2.Angle(from, to);  
    		return cross.z > 0 ? -angle : angle;  
    	}  
    }

    到這里我們對于用touchpad控制無人機的飛行就完成了。但是touchpad在普通場景里用于控制手柄發出射線進行碰撞檢測來實現 傳送位移。因此我們再直升機室里加了一個cube當做trigger,通過手柄扳機觸發來進入飛行狀態,飛行狀態時,向前面的代碼的bool值IsFlying傳值為true,同時將手柄上的VRTK_SimplePointer組件的enable設置為false,這樣就不會發出射線了。

    下面是綁在這個觸發器Cube上的代碼:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using VRTK;
    
    public class FlyingTrigger : VRTK_InteractableObject {
    
    	public GameObject airVehicle;
    	public Transform airVehiclePos;
    
    	[Header("ControllerDevices", order = 1)]
    	public GameObject controllerLeft;
    	public GameObject controllerRight;
    
    	VRTK_SimplePointer pointerLeft;
    	VRTK_SimplePointer pointerRight;
    	// Use this for initialization
    	public override void StartUsing(GameObject usingObject)
    	{
    		base.StartUsing(usingObject);
    		airVehicle.GetComponent<Flying> ().IsFlying = true;
    		pointerLeft.enabled = false;
    		pointerRight.enabled = false;
    	}
    
    	public override void StopUsing(GameObject usingObject)
    	{
    		base.StopUsing(usingObject);
    		airVehicle.GetComponent<Flying> ().IsFlying = false;
    		pointerLeft.enabled = true;
    		pointerRight.enabled = true;
    		airVehicle.transform.position = airVehiclePos.position;
    
    	}
    
    	protected override void Start()
    	{
    		base.Start();
    	}
    
    	protected override void Awake()
    	{
    		base.Awake ();
    		pointerLeft = controllerLeft.GetComponent<VRTK_SimplePointer> ();
    		pointerRight = controllerRight.GetComponent<VRTK_SimplePointer> ();
    	}
    }

    這樣一來就實現了無人機模擬操縱的功能,最后將資源都搭好放置在一個房間里。

    版權聲明:本文為yzy565280261原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/yzy565280261/article/details/80299857

    智能推薦

    Unity開發HTC vive 五、拾取和觸碰

    Unity開發HTC vive 五、拾取和觸碰 2017年3月24日修改 vive的sdk SteamVR在升級,會有些改動。最新的SteamVR1.2.1在Unity5.4.4下狂報錯。 下面的內容是在以下環境完成的 unity5.4.4 SteamVR1.2.0(http://download.csdn.net/detail/wuyt2008/9792970) ViveInputUtility...

    眼球追蹤技術 Unity+ HTC vive Pro + DroolonF1 (二)

    本篇將如何開發,如果您喜歡請收藏、點贊、打賞~ 博主使用環境:Unity 2018.3.7、   Win 10 x64、 HTC vive Pro demo下載:下載地址 1.新建Camera 2.ViveSR--Prefabs中拖入預制體SRanipal Eye Framework,默認設置即可 3.ViveSR--Prefabs中拖入預制體 Gaze Ray Sa...

    unity開發HTC VIVE虛擬現實應用入坑筆記(三)——InteractionSystem

    新版的SteamVR插件內置了InteractionSystem示例,能夠實現包括跳躍、物體抓取、觸碰式UI等基礎功能,不需要寫啥代碼,就能實現一些簡單的VR功能,著實是一大福利,原來一直使用的VRTK,現在有這個系統后,基本不用了,有興趣的朋友可以自行了解。 InteractionSystem的主要預設都放在SteamVR->InteractionSystem目錄下 下面簡單介紹幾個常用的...

    使用手柄抓取物體(Unity / SteamVr / Htc Vive)

    導入SteamVr插件,然后將Interactable腳本和Core腳本掛載到需要抓取的物體上即可 加載SteamVr插件 點擊左上方的商店,進入商店頁面 在商店頁面的搜索框中搜索SteamVr,找到下圖所示插件,點擊下載導入即可 在導入SteamVr插件后,可能經常會有彈窗提醒,點擊接受即可 交互腳本Interactable Interactable腳本在導入的SteamVr插件中就有,路徑如下...

    基于unity無人機3D仿真《一》

    基于unity無人機3D仿真《一》實現無人機的模型的制作、運動學關系、姿態角等;實現無人機各種姿態運動。 一、目前的效果 二、無人機模型 制作軟件:maya 模型結構: 三、開發平臺 unity2017 + VS2019 + C# 四、無人機模型及控制規律 飛行姿態控制 高度控制: 俯仰控制:繞無人機自身y軸運動(前后) 橫滾控制:繞無人機自身x軸運動(左右) 偏航控制:繞無人機自身z軸運動(自旋...

    猜你喜歡

    unity無人機3D仿真總結

    開發平臺:unity2017 個人版 目前實現的效果: 無人機的模型是采用moya軟件制作。 控制代碼是使用C#語言。 總結C#語言的用法: (1)腳本的生命周期 1)Awake():在游戲運行時調用,用于初始化,在加載場景時運行。 2)Start()在游戲開始時執行一次,在Awake()函數后面執行。一般將變量初始化、游戲對象的獲取是放在這個函數中運行。 3)Update()在游戲的每一幀都會運...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡