OpenVR+OSG_成功取得VR手柄模型

IVRRenderModels::GetRenderModelName

用这个函数取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;
		}/**/
相关文章
相关标签/搜索