osg加载视频到指定位置

osg加载视频到指定位置


原理:用ffmpeg插件读取视频流,并作为纹理texture贴在图形geometry上,geometry可以设置形状和坐标。

1.编译ffmpeg插件

参考:http://www.cnblogs.com/coolbear/p/8548440.html
这里我把ffmpeg作为三方库又重新编译了一遍osg,若出现osgdb_ffmpegd.dll则编译成功。(在osgPlugins里找)
编译成功后把ffmepg的dll和osgdb_ffmpegd.dll都放在osg源码编译好的bin目录下。
在这里插入图片描述
在这里插入图片描述
也可以直接下载我编译好的ffmpeg插件~
是在VS2013 & osg3.4环境下编译的,不知道其他环境能不能用。
https://download.csdn.net/download/lemon_haha/11062017

2.代码

  • 测试能否加载视频
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/ImageStream>
#include <osg/Texture2D>

int main()
{
	//注册插件
	osgDB::Registry::instance()->addFileExtensionAlias("avi", "ffmpeg");
	osg::ref_ptr<osg::Image> image;

	//本地视频(自己选择视频路径)
	image = osgDB::readImageFile("aaa.avi");
	osg::ImageStream* imageStream = dynamic_cast<osg::ImageStream*>(image.get());
	if (imageStream)
		imageStream->play();

	//添加到四边形
	osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
	texture->setImage(image.get());
	osg::ref_ptr<osg::Drawable> quad = osg::createTexturedQuadGeometry(
		osg::Vec3(), osg::Vec3(-1.0f, 0.0f, 0.0f), osg::Vec3(0.0f, 0.0f, 1.0f));//
	quad->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get());

	//添加到geode
	osg::ref_ptr<osg::Geode> geode = new osg::Geode;
	geode->addDrawable(quad.get());
	geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE);

	//添加到场景
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
	viewer->setSceneData(geode.get());
	viewer->run();
}

  • 加载视频到指定位置
    将上面代码中的“添加到四边形”部分修改为以下代码。然后自己设置顶点坐标。
    这里我是在场景中选取点保存坐标然后读取的,也可以直接设置顶点坐标:)
    顶点选取的顺序为逆时针,第一个从左上角(0,1)开始选取。
    ( 这里视频和纹理的顶点对应关系存疑,如果不对可以自己尝试修改顶点顺序。)
    //添加到四边形
	//========================在这里设置顶点坐标=======================================
	osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
	ifstream inFile;
	inFile.open("cameraVideoPoint.txt");
	for (int i = 0; i < 4; i++)
	{
		double x, y, z;
		inFile >> x >> y >> z;
		v->push_back(osg::Vec3(x, y, z+0.3));
	}
	//========================在这里设置顶点坐标=======================================
    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
	geom->setVertexArray(v.get());
	geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON, 0, 4));

	//设置纹理坐标
	osg::ref_ptr<osg::Vec2Array> tcoords = new osg::Vec2Array();
	//加载出来不知道为什么是反的,所以我改为了顺时针
	tcoords->push_back(osg::Vec2(0.0f, 0.0f));
	tcoords->push_back(osg::Vec2(0.0f, 1.0f));
	tcoords->push_back(osg::Vec2(1.0f, 1.0f));
	tcoords->push_back(osg::Vec2(1.0f, 0.0f));

	geom->setTexCoordArray(0, tcoords);
	geom->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get());
	
	geode->addDrawable(geom);//geode的drawable改一下

最后图我就不贴出来啦~关于顶点和纹理的对应关系欢迎讨论:)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值