用这个函数取Steam提供的模型, Steam还提供generic游戏手柄模型oculus的手柄模型,等...数组
可是, 所跟踪设备的ID与模型ID并无一一对应, 两个手柄的模型对应3与4,而HTC VIVE手柄模型的ID函数
这个ID值超过了k_unMaxTrackedDeviceCount , 因此以前一直找不到.ui
在hellovr_opengl例子中不是这样取的. 没看清是怎么取的.spa
代码:code
// 直接取VR手柄模型: if(!m_bController3Ready || !m_bController4Ready) { vr::RenderModel_t *pModel=nullptr; vr::EVRRenderModelError err= m_vrRenderModels->LoadRenderModel_Async("vr_controller_vive_1_5",&pModel);// 一但读取成功, err的结果为vr::VRRenderModelError_None if(pModel && err!=vr::VRRenderModelError_Loading) { m_vController3 = pModel; m_vController4 = pModel; m_bController3Ready=true; m_bController4Ready=true; cout<<"取模型完毕 vr_controller_vive_1_5"<<endl; } }
这里直接用模型的名称去取两个手柄共用一个模型orm
关于如何把取到的模型画出来. 目前暂时用多边型代替, 没能用网格物体, 这样是无法贴图的.游戏
有去看OSG里的基本物体是怎么画的, 比想像中的难, 因此还没深刻去看.get
绘画的代码:it
if(m_bController3Ready && !m_bController3DrawDone){ osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; //首先定义四个点: osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array; geom->setVertexArray(v.get()); //v->push_back(osg::Vec3(0005.753f,0011.188f,0050.148f)); //v->push_back(osg::Vec3(0005.27f,0012.092f,0050.272f)); //v->push_back(osg::Vec3(0004.707f,0011.718f,0051.579f)); for(uint32_t i=0;i<m_vController3->unVertexCount;++i){ v->push_back(osg::Vec3(p1->vPosition.v[0] , p1->vPosition.v[1] , p1->vPosition.v[2] )); ++p1; } // 定义颜色数组: osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array; geom->setColorArray(c.get()); geom->setColorBinding(osg::Geometry::BIND_OVERALL); c->push_back(osg::Vec4(1.f,1.f,1.f,.5f)); //c->push_back(osg::Vec4(0.f,1.f,0.f,1.f)); //c->push_back(osg::Vec4(0.f,0.f,1.f,1.f)); //c->push_back(osg::Vec4(1.f,1.f,1.f,1.f)); //定义法线: osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array; geom->setNormalArray(n.get()); geom->setNormalBinding(osg::Geometry::BIND_OVERALL); n->push_back(osg::Vec3(0.f,-1.f,0.f)); cout<<"顶点数:"<<m_vController3->unVertexCount<<endl; //设置顶点关联方式 geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON,0,m_vController3->unVertexCount)); //几何组节点 osg::ref_ptr<osg::Geode> geode = new osg::Geode; geode->addDrawable(geom); // 放大一千倍 osg::Matrix cc = osg::Matrix::scale(99,99,99); osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform; trans->setMatrix(cc); trans->addChild(geode); //gScene->addChild(trans); //cout<<"改变场景:"<<endl; //viewer->setSceneData(trans); osg::Group *gScene = new osg::Group;// 子场景 cout <<"叁:把手柄放大"<<endl; gScene->addChild(trans); m_mtController3 = trans; viewer->addChild(gScene); m_bController3DrawDone=true; }/**/