#unity##HTC VIVE#實現簡單的無人機操作模擬
為了在我們的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> ();
}
}
這樣一來就實現了無人機模擬操縱的功能,最后將資源都搭好放置在一個房間里。
智能推薦
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()在游戲的每一幀都會運...
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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...