osg.ImageStream
是一个用于动态获取图像流的类。
osg.ImageStream
首先需要指定一个图像序列文件(通常是视频文件),然后使用 osgDB
加载它。一旦文件被加载,osg.ImageStream
可以方便地读取和处理连续的帧以动态地渲染场景。
// ImageStream.h
typedef unsigned long FrameStampType;
// ImageStream.h
ImageStream(const ImageStream&);
ImageStream(const std::string& filename = "", bool looped = true, bool useFrameAsTime = false, double referenceTime = 0.0);
// StreamOperator.h
const char* className() const;
const char* libraryName() const;
// ImageStream.h
FrameStampType getLength() const;
FrameStampType getCurrentFrameNumber() const;
double getCurrentTime() const;
double getTimeMultiplier() const;
bool getLoopingMode() const;
bool getUseFrameAsTime() const;
double getReferenceTime() const;
osg::Image* getCurrentImage() const;
osg::Image* readImage(FrameStampType);
bool isValid() const;
bool isSameKindAs(const Object* obj) const;
getLength
FrameStampType getLength() const;
返回图像序列的帧数或持续时间。
getCurrentFrameNumber
FrameStampType getCurrentFrameNumber() const;
返回当前正在渲染的帧的序号。
getCurrentTime
double getCurrentTime() const;
返回当前正在渲染的帧的时间。
getTimeMultiplier
double getTimeMultiplier() const;
返回时间倍增器,可以加速或减缓动画。
getLoopingMode
bool getLoopingMode() const;
返回是否循环播放图像序列。
getUseFrameAsTime
bool getUseFrameAsTime() const;
如果为 true
,则渲染使用帧号作为时间轴,若为 false
,则使用当前时间。
getReferenceTime
double getReferenceTime() const;
返回时间轴的参考时间,可以为负时间,当相机需要在时间轴的某个点上移动时很有用。
getCurrentImage
osg::Image* getCurrentImage() const;
返回当前正在渲染的图像。
readImage
osg::Image* readImage(FrameStampType);
读取图像序列中指定帧的图像。FrameStampType
是 unsigned long
类型,是帧数或时间戳。
isValid
bool isValid() const;
返回是否成功加载图像序列。
isSameKindAs
bool isSameKindAs(const Object* obj) const;
返回是否同类型对象。
#include <osg/ImageStream>
#include <osgViewer/Viewer>
int main()
{
osgViewer::Viewer viewer;
viewer.setUpViewInWindow(50, 50, 800, 600);
osg::ref_ptr<osg::ImageStream> imageStream = new osg::ImageStream("C:/video.avi");
if (imageStream->isValid()) {
osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D(imageStream);
texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
osg::ref_ptr<osg::Geometry> quad = osg::createTexturedQuadGeometry(
osg::Vec3(-1.0, 0.0, -1.0), osg::Vec3(2.0, 0.0, 0.0), osg::Vec3(0.0, 0.0, 2.0));
geode->addDrawable(quad);
quad->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
viewer.setSceneData(geode);
return viewer.run();
}
return 0;
}
在上述示例中,我们创建了一个 osgViewer::Viewer
对象,并使用 osg::ImageStream
加载了一个视频文件。然后我们创建了一个平面几何体,并将 osg::Texture2D
与之关联,使其使用 osg::ImageStream
作为纹理。最后将平面几何体添加到场景图中并运行查看器。