#include<osg/Geometry>
#include<osg/Geode>
#include<osgViewer/Viewer>
#include<osgViewer/ViewerEventHandlers>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include<osg/DrawPixels>
#include<osg/PositionAttitudeTransform>
int main(int argc, char *argv[])
{
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
osg::ref_ptr<osg::DrawPixels> image = new osg::DrawPixels;
image->setPosition(osg::Vec3(10.0, 0.0, 0.0));
//裁剪区域
image->setSubImageDimensions(320, 320, 320, 320);
image->setImage(osgDB::readImageFile("test.png"));
geode->addChild(image);
root->addChild(geode);
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->addEventHandler(new osgViewer::WindowSizeHandler());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
}
效果如下:
存在的问题:
- image->setPosition(osg::Vec3(10.0, 0.0, 0.0));不起作用,无论设置图片从哪个点显示都不起作用,貌似只能从(0, 0, 0)点显示,用PositionAttitudeTransform也不行,难道图片就只能在osg::Vec3(0.0, 0.0, 0.0)处?(说明:我上面显示效果不是全图,全图太大,只是截的小图,从小图看好像图片显示点不是在(0, 0, 0),这是截图造成的,实际确实是在(0, 0, 0)点)。
- 图片不支持鼠标操作,即不支持鼠标放大、缩小、旋转操作。
- 上面的第22行setSubImageDimensions函数中的第1、2个参数是图片左上角的横坐标和纵坐标,第3、4个参数是要显示的图片宽度和高度,必须保证:第1参数值 + 第3参数值 <= 图片总宽度;且必须保证:第2参数值 + 第4参数值 <= 图片总高度,否则程序会崩溃,报:帧不在模块中,有点类似C++中的内存越界。
- 必须确保相应类型图片的第三方库存在,否则读取图片不会成功 ,如:如果是PNG图片,libPng.lib或类似的库文件、动态库等在指定的目录下存在。