本节功能
本节我们将使用Mp4当纹理,贴在一个面上,不断的播放它。如下图:
本节资源
本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹。
注意: 务必使用浏览器打开:
【击此打开网盘资源链接】
具体实现
在第23节 编译-《OSG&OE编译一本通》永久性解决编译问题中讲解了如何编译ffmpeg插件,其实实现起来就很方便了,ffmpeg插件可以读取几乎所有的视频格式,直接将mp4文件当成一个图片读进来就可以。
在读取前,我们要指定使用ffmpeg插件来读取mp4格式,使用如下语句:
osgDB::Registry::instance()->addFileExtensionAlias("mp4", "ffmpeg");
然后我们可以直接进行读取,并控制:
osgDB::Registry::instance()->addFileExtensionAlias("mp4", "ffmpeg");
osg::Image* image = osgDB::readImageFile("1.mp4");
//转换成图片流,然后播放
osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image);
if (imagestream)
{
imagestream->play();
}
此时image就是一个正常的图片,当传入纹理使用即可。
另外
mp4除了图像外,还有声音,当然这个mp4录的时候就没有声音,如果想了解关于声音控制等更多内容,可以参考osg自带的例子:osgmovie
本节全部代码
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Geode>
#include <osg/ImageStream>
#include <osg/Texture2D>
osg::Node* createAPlane()
{
osg::Geode* gnode = new osg::Geode;
gnode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE);
osg::Geometry* geom = new osg::Geometry;
gnode->addDrawable(geom);
//顶点
osg::Vec3Array* vertex = new osg::Vec3Array;
geom->setVertexArray(vertex);
//纹理
osg::Vec2Array* coord = new osg::Vec2Array;
geom->setTexCoordArray(0, coord);
//压入四个顶点构成一个面,我这个视频是1260x788的,比例很奇葩
vertex->push_back(osg::Vec3(0.0, 0.0, 0.0));
coord->push_back(osg::Vec2(0.0, 0.0));
vertex->push_back(osg::Vec3(1260.0, 0.0, 0.0));
coord->push_back(osg::Vec2(1.0, 0.0));
vertex->push_back(osg::Vec3(1260.0, 0.0, 788.0));
coord->push_back(osg::Vec2(1.0, 1.0));
vertex->push_back(osg::Vec3(0.0, 0.0, 788.0));
coord->push_back(osg::Vec2(0.0, 1.0));
geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));
//读取纹理
osgDB::Registry::instance()->addFileExtensionAlias("mp4", "ffmpeg");
osg::Image* image = osgDB::readImageFile("1.mp4");
//转换成图片流,然后播放
osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image);
if (imagestream)
{
imagestream->play();
}
osg::Texture2D* texture = new osg::Texture2D(image);
texture->setResizeNonPowerOfTwoHint(false);
texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
geom->getOrCreateStateSet()->setTextureAttributeAndModes(0,
texture,
osg::StateAttribute::ON);
return gnode;
}
int main()
{
osgViewer::Viewer viewer;
viewer.setSceneData(createAPlane());
return viewer.run();
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容