Unity SteamVR外掛程式中自帶的兩個小功能

2021-09-11 21:41:38 字數 2788 閱讀 9625

steamvr_gazetracker(凝視)

凝視是一種在沒有手柄等輸入裝置的情況下,可以通過眼睛盯著某個物體看來與物體進行互動的體驗。

我們只需要將個輔組類新增到我們想要凝視的物體上,比如選單等,就可以實現凝視的功能。現在我們來看看凝視的實現原理。

void update () rigidbody rigidbody = pointer.addcomponent();

rigidbody.iskinematic = true;

} else {

if(collider) {

object.destroy(collider);

/8,設定雷射束的材質/

material newmaterial = new material(shader.find(「unlit/color」));

newmaterial.setcolor("_color", color);

pointer.getcomponent().material = newmaterial;

public virtual void onpointerin(pointereventargs e) {

if (pointerin != null) pointerin(this, e);

public virtual void onpointerout(pointereventargs e) {

if (pointerout != null) pointerout(this, e);

// update is called once per frame

void update () {

/第一次呼叫時將holder設為active/

if (!isactive) {

isactive = true;

this.transform.getchild(0).gameobject.setactive(true);

/將雷射束的最遠距離設為100公尺/

float dist = 100f;

/獲取當前物體(手柄)上的steamvr_trackedcontroller指令碼/

steamvr_trackedcontroller controller = getcomponent();

/構造一條射線/

ray raycast = new ray(transform.position, transform.forward);

raycasthit hit;

bool bhit = physics.raycast(raycast, out hit);

/射線命中物體後移出,說明物體不在命中,呼叫onpointerout的通知/

if(previouscontact && previouscontact != hit.transform) {

pointereventargs args = new pointereventargs();

if (controller != null) {

args.controllerindex = controller.controllerindex;

args.distance = 0f;

args.flags = 0;

args.target = previouscontact; onpointerout(args);

previouscontact = null;

/射線命中物體,呼叫onpointerin的通知/

if(bhit && previouscontact != hit.transform) {

pointereventargs argsin = new pointereventargs();

if (controller != null) {

argsin.controllerindex = controller.controllerindex;

argsin.distance = hit.distance;

argsin.flags = 0;

argsin.target = hit.transform;

onpointerin(argsin);

previouscontact = hit.transform;

if(!bhit) {

previouscontact = null;

/如果命中物體距離大於100,則無效,否則有效/

if (bhit && hit.distance < 100f) {

dist = hit.distance;

if (controller != null && controller.triggerpressed) {

/當按下扳機鍵時,將光束的粗細增大5倍,長度會設為dist,通過這種方法讓光線不會穿透物體/

pointer.transform.localscale = new vector3(thickness * 5f, thickness * 5f, dist);

else {

/沒按下扳機或者當前控制器沒有新增steamvr_trackedcontroller時,顯示原始粗細的光束/

pointer.transform.localscale = new vector3(thickness, thickness, dist);

/將光束的位置設在光束長度的一半的位置,使得光束看起來是從手柄發出來的/

pointer.transform.localposition = new vector3(0f, 0f, dist/2f);

看完了steamvr_laserpointer的**,我們就知道了雷射束實現的原理,其實雷射束實現起來還是蠻簡單的,但是在vr的互動中,使用起來非常的方便。

unity steamVR 學習隨筆3

指令碼 1.interactedable 該指令碼用於和手柄產生反饋,專案中需要和手柄產生互動的物體都需要加入該指令碼。2.interactedable hover events 該指令碼用於執行物體被手柄選中後的互動操作。方法 3.interactedable button events 該指令碼...

unity steamVR學習隨筆6

一 直接抓取 1.控制手柄抓取基礎 1.向互動的目標物體掛載指令碼vrtk interactable object並新增碰撞體 vrtk interactable object指令碼解析 2.控制器抓取物體時消失 3.控制手柄震動 向互動物體新增vrtk interact haptics指令碼 vr...

外掛程式中的this

q jquery外掛程式的寫法,網上查到有兩種 第一種 function jquery 第二種 function jquery 請問這兩張有什麼區別?貌似第一種用的人多,但我看jq原始碼中是第二種 a fn.pluginname function opt 就是為jquery的prototype定義了...