关于OSG+VR里显示手柄的工作记录
< 返回列表时间: 2017-12-06来源:OSCHINA
简要:
各种走弯路, 矩阵还不是很会.
osg的自带漫游器对像机有影响, 起初不知道.
现在还有一些未解之迷, 比如90帧 的帧率是怎么来的? SteamVR提供的?
手柄模型目前依然用面的绘制方式, 不好看, 不会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的
那么, 能否用原生的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天
热门排行