OSG
使用OSG:
-
OSGINCLUDE
: D:\OSG\include -
OSGLIB
: D:\OSG\lib
使用OSG Examples:
-
OSG_FILE_PATH
: D:\OSG\Data
调试窗口,方便查看问题:
-
OSG_NOTIFY_LEVEL
: DEBUG
窗口化,防止死机,方便截图 😓
-
OSG_WINDOW
: 80 80 800 400
总体思路是在Group里增加一个MatrixTransform,实现平移操作。然后在MatrixTransform中对StateSet属性设置Material,在Material中就可以方便的设置Color了。
代码如下:
// make translate
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
osg::Matrix m;
m.makeTranslate(osg::Vec3(5.f, 5.f, 5.f)); // x -> 5, y -> 5, z -> 5
mt->setMatrix(m);
// add geode on MatrixTransform
mt->addChild(geode.get()); // geode is the osg::ref_ptr<osg::Geode>.
// set color through Material and StateSet
osg::ref_ptr<osg::StateSet> stateset = mt->getOrCreateStateSet();
osg::ref_ptr<osg::Material> material = new osg::Material;
material->setColorMode(osg::Material::OFF);
material->setAmbient(Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
material->setDiffuse(Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
stateset->setAttribute(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
mt->setStateSet(stateset);
// add MatrixTransform on Group
group->addChild(mt.get()); // group is the osg::Group. osg::Node is also ok.
参考资料:
对于一些疑难杂症,最好的方式就是查看日志信息。OSG中也有这样的工具。
需要做以下设置:
设置系统环境变量:OSG_NOTIFY_LEVEL
== DEBUG
可能需要重启电脑,再次运行OSG程序时,在CMD窗口中就可以看到日志信息了。
注意: 在 OSG 与 Qt 结合的代码中, 使用 DEBUG 的 Mode 可能存在问题: 在程序退出时, 出现指针越界错误, 恰恰出现在 osg::Notify
类中. 这是由于该全局单例在 3D 窗口关闭时已经析构. 而在整个应用程序退出时, 仍有 context data 的对象需要析构, 析构时会调用早已不存在的 osg::Notify
单例. 造成 crash.
参考资料:
QImage& image = _qimages[i];
unsigned char* data = image.bits();
OSG_INFO<<"assignImage("<<i<<") image = "<<&image<<" size = ("<<image.width()<<","<<image.height()<<") data = "<<(void*)data<<std::endl;
// _image is osg::observer_ptr<osg::Image>
_image->setImage(image.width(), image.height(), 1,
4, GL_RGBA, GL_UNSIGNED_BYTE,
data, osg::Image::NO_DELETE, 1);
参考自:QGraphicsViewAdapter.assignImage of osgQt 源码。
QImage image(m_image->data(), width, height, pixelFormat == GL_RGB ? 3 : 4, QImage::Format_RGB32);
image = image.mirrored(true, true);
image.save(fileName, "png");
如果出现以上警告,可以打开调试模式,查看详尽的原因。 一般都会告知你找不到某dll,如上述错误,会提示找不到osgdb_freetype.dll
。这是第三方插件中的内容,负责字体的加载。同样类似的还包括图片加载的dll,如osgdb_pngd.dll
等。那么问题出在哪里呢?
是编译OSG时遗漏了对3rdParty的配置。重新打开当时编译OSG的CMark,务必勾选上Advanced. 如下图所示:
然后找到FREETYPE_
开头的配置,也要填写正确,需要注意的是,引入目录要选择ft2build.h所在的目录。如下图所示:
这样就基本解决了上述警告、以及字体无法加载的问题。
若为PNG等图片加载的dll缺失,则又要注意另一点。即要先配置zlib。如下图所示:
如果不配置这个,CMake是不会出现PNG_
开头的一系列配置的。待配置完成、CMake刷新后,可找到PNG_
开头的配置,填写即可。如下图所示:
OK,上述过程皆完成后,可再次点击Configure,并点击Generate。重新打开相应的项目,再次编译即可。
参考资料:
使用void setRotation(const osg::Quat &quat)
方法。
这里要注意的是,该方法永远是从这样一个状态开始的:文字在X、Y轴决定的平面内,面对Z轴的正方向。
不要以为你之前设置了setAxisAlignment (AxisAlignment axis)
,就以为从这个平面开始旋转。看源码可以知道,该方法内部使用的也是setRotation
方法。
参考资料