关于OSG+VR里显示手柄的工作记录

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

简要:

各种走弯路, 矩阵还不是很会. 

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天

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看