關於OSG+VR裏顯示手柄的工做記錄

簡要:

各類走彎路, 矩陣還不是很會. git

osg的自帶漫遊器對像機有影響, 起初不知道.github

如今還有一些未解之迷, 好比90幀 的幀率是怎麼來的? SteamVR提供的?api

手柄模型目前依然用面的繪製方式, 很差看, 不會openGL,沒辦法.數組

TXT:

找到了加載手柄的代碼:
error = vr::VRRenderModels()->LoadRenderModel_Async( pchRenderModelName, &pModel );//1: lh_basestation_vive 2:vr_controller_1_5
但這個函數LoadRenderModel_Async裏有源碼函數

CGLRenderModel::Draw()  RenderModel把本身畫出來, 問題是經過什麼方式把本身畫出來
裏面調用的方法, 是來自glew.h的spa

那麼, 可否用原生的OpenGL 在OSG中繪圖?對象

1>main.obj : error LNK2001: 沒法解析的外部符號 __imp___glewActiveTexture
1>main.obj : error LNK2001: 沒法解析的外部符號 __imp___glewBindVertexArray
1>MSVCRT.lib(crtexe.obj) : error LNK2001: 沒法解析的外部符號 main
由於文件SDL.h, 出現了沒法解析main的錯誤.
LNK2001 是平臺問題 sample示例用的是Debug  win32
Debug與Release的區別可能不要緊,由於Sample項目就是加載Release版的lib,但用Debug版編譯
這個Sample是在OSG64文件夾內的,倒是32位
編譯經過, 如今要加載dll
openvr108\samples\bin\win64 這裏面也有個glew32.dll
出現已中止工做 , 出錯位置是0x0000 沒有出錯的代碼處事件

沒有OpenGL的基礎, 這個錯誤我解決不了.圖片

############################################################################################文檔

若是, 顯示手柄是SteamVR或HTC VIVE內置的api. 那麼,是沒有模型文件的.
但, 在OpenGL裏, 與Unity裏, 手柄的表現是不同的. OpenGL裏沒有扳機按壓的過程.
renderModelName 與OpenGL裏的 同樣是:vr_controller_vive_1_5


############################################################################################

https://github.com/ValveSoftware/openvr/wiki/API-Documentation#initialization-and-cleanup
IVRSystem  兩隻眼睛的映射, 頭盔手柄的跟蹤, 事件的響應
Compositor排字工人  在updatePose裏有被用到   WaitGetPoses
IVOverlay 疑似在三維場景中顯示二維圖像的API  有例子, 但例子是QT的
    若是要作模型程序,現有的VR場景要能跑通
Screenshots  我猜是截屏截成圖片, 兩個sample工程都沒用到, 不知具體是什麼


那麼, 桌面屏幕的投影是怎麼實現? HMD的投影是怎麼實現的? IVRSystem

扣代碼, 直接扣過來用啊. 目前需求是, 在VR裏顯示osg的場景,就這一點而已.
把OpenVRDll64那個工程再複製一遍過來後, 就沒有頭文件衝突的那一狀況了.
    以前封裝的函數, 不能正常顯示
    如今想封裝成一個inline函數 , 各類出錯

####

爲了拷手柄模型獲取代碼, 還要加引入頭文件的目錄
glew32.lib
出現不能解析的外部符號bool __cdecl CGLRenderModel::BInit
代碼還沒拷完
把glew32.dll拷過來, 這個dll在x64下也能用.
GetRenderModelCount() 這個函數取出來的模型數是51 ,太多了, 且不受設備開關的影響,多是一個常量
helloVR是怎麼取到設備名的, helloVR是怎麼取到設備id的
helloVR中, 經過 GetTrackedDeviceString這個函數取設備名
手柄的設備號是3或4 
osg這邊取到的設備名是: generic_controller 與 generic_hmd  分別是3與4
設備數只有4個, 沒找到更多設備  vr::k_unTrackedDeviceIndex_Hmd 算上跳過的這個,五個
又要建全局變量, 還好在模塊內,其餘模塊調取不到.
還要應對手柄中途關掉或沒電的狀況.

在openvrdevice裏無法取得viewer因此繪圖依賴外部調用.

####
取到的3與4並非vr手柄模型, 輸出全部模型, 沒有以前的
lh_basestation_vive 2:vr_controller_1_5
vr 手柄在16個模型以外

大於4的模型名:5 : generic_tracker
大於4的模型名:6 : hard_bounds
大於4的模型名:7 : laser_pointer
大於4的模型名:8 : lh_basestation_01_boysandgirls
大於4的模型名:9 : lh_basestation_02_batman
大於4的模型名:10 : lh_basestation_03_robin
大於4的模型名:11 : lh_basestation_vive
大於4的模型名:12 : lighthouse_ufo
大於4的模型名:13 : mptam_hmd_model
大於4的模型名:14 : oculus_cv1_controller_left
大於4的模型名:15 : oculus_cv1_controller_right

能顯示手柄模型了 雖然不完美
###################################################################

如今手柄的移動與現實中不匹配.
看看hellovr裏怎麼作的.RenderControllerAxes裏做了處理
m_rmat4DevicePose這數據也是從mDeviceToAbsoluteTracking裏取的.

手柄的旋轉亂遭遭的, 是否是左手座標系?

在hellovr_opengl_main.cpp的1145行作矩陣的試驗
因此, 那矩陣的最後一行就是座標   這行不受
還能夠看看頭盔是怎麼移動的.
頭顯的移動, 也是受角度影響的, 卻沒問題. 有一個不一樣點是, 頭顯是做用於像機,而手柄是做用於場景中的物體.
環境不同, hellovr裏的取到的矩陣, 取到的最後一行不因角度的改變而改變.
hellovr輸出:    1.918463, 0.884200,  0.470154 , 1.000000
osg輸出:    0.179302, 0.00267851,0.0541984, 1

####################################################################
要麼學會計算, 要麼找出座標不一樣的緣由
####################################################################
openvrdevices是如何刷幀獲取設備座標的?
    在OpenVRUpdateSlaveCallback裏 updatePose被調用

osg這邊, 與openGL有沒有什麼初始化參數上的區別?
    從openvrdevices裏, 看不到什麼參數

有沒有90幀這個參數?沒有! 那麼updateSlave在哪被調用?
    slave中有調用updateSlaveImplementation這個是osg的函數,多是由這個觸發osg刷新的,
    否則osg只有60幀
    OpenVRUpdateSlaveCallback : public osg::View::Slave::UpdateSlaveCallback
    是用OSG的規範
    m_view對象只,有兩個slave視口
    gc->setSwapCallback(swapCallback); 是否是這句有影響?
    最後,在swapBuffersImplementation失去線索
    
####################################################################
例子的代碼可讀性是有的, OpenVR文檔是有的, 但我該怎麼作?
如何由VR設備進行刷幀 , 我找不到, 只能由osg觸發刷幀
那麼, 先作出一個模型程序, 看可否取得View的刷幀事件回調函數.
    就先用NodeCallback StackOverflow上,也是這麼講的


如今輸出了整個矩陣數組, 發現m[0][3] ~ m[2][3]是能夠的.
那爲何Matrix44不行?

建幾個立方體來做參照物
    跟據參照物, 手柄的X與Z沒問題
    參照物,大小爲.3的, 爲z向


1. 對於手柄, 有個軸是反的,  倒底是手柄模型要倒置仍是座標要倒置?
2. 像機的座標規範, 但可否用手柄的規範


狀態1:放桌上
0.957936        0.0671016       0.279027        0
-0.129168       0.969042        0.210413        0
-0.25627        -0.237603       0.936947        0
-0.0621173      0.0138077       -0.157989       1  <<Matrix44
狀態2:放椅子上
0.865644        0.010904        0.500541        0
-0.125182       0.972721        0.195301        0
-0.484757       -0.23172        0.843396        0
-1.19622        -0.439365       3.71773 1  <<Matrix44

狀態3: 椅子靠窗
0.945089        0.0206033       0.326164        0
-0.101473       0.967185        0.232931        0
-0.310661       -0.253237       0.916166        0
0.0451128       -0.428728       3.79893 1  <<Matrix44
狀態4:椅子離窗
0.956137        0.0306015       0.291316        0
-0.106346       0.962934        0.247889        0
-0.272932       -0.267997       0.923951        0
-2.19937        -0.433549       3.14582 1  <<Matrix44

完成了兩隻手柄開關狀態的模型顯示 用時10天

相關文章
相關標籤/搜索