Skip to content
pezy edited this page Jul 12, 2018 · 2 revisions

常用的环境变量

使用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

copy and move geode with different colors

总体思路是在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 Debug Mode

对于一些疑难杂症,最好的方式就是查看日志信息。OSG中也有这样的工具。

需要做以下设置:

设置系统环境变量:OSG_NOTIFY_LEVEL == DEBUG

可能需要重启电脑,再次运行OSG程序时,在CMD窗口中就可以看到日志信息了。

注意: 在 OSG 与 Qt 结合的代码中, 使用 DEBUG 的 Mode 可能存在问题: 在程序退出时, 出现指针越界错误, 恰恰出现在 osg::Notify 类中. 这是由于该全局单例在 3D 窗口关闭时已经析构. 而在整个应用程序退出时, 仍有 context data 的对象需要析构, 析构时会调用早已不存在的 osg::Notify 单例. 造成 crash.


参考资料:

QImage to osg::Image

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 源码。

osg::Image to QImage

QImage image(m_image->data(), width, height, pixelFormat == GL_RGB ? 3 : 4, QImage::Format_RGB32);
image = image.mirrored(true, true);
image.save(fileName, "png");

Warning: Could not find plugin to read objects from file ...\fonts\arial.ttf

如果出现以上警告,可以打开调试模式,查看详尽的原因。 一般都会告知你找不到某dll,如上述错误,会提示找不到osgdb_freetype.dll。这是第三方插件中的内容,负责字体的加载。同样类似的还包括图片加载的dll,如osgdb_pngd.dll等。那么问题出在哪里呢?

是编译OSG时遗漏了对3rdParty的配置。重新打开当时编译OSG的CMark,务必勾选上Advanced. 如下图所示:

CMark

然后找到FREETYPE_开头的配置,也要填写正确,需要注意的是,引入目录要选择ft2build.h所在的目录。如下图所示:

FreeType

这样就基本解决了上述警告、以及字体无法加载的问题。

若为PNG等图片加载的dll缺失,则又要注意另一点。即要先配置zlib。如下图所示:

ZLIB

如果不配置这个,CMake是不会出现PNG_开头的一系列配置的。待配置完成、CMake刷新后,可找到PNG_开头的配置,填写即可。如下图所示:

PNG

OK,上述过程皆完成后,可再次点击Configure,并点击Generate。重新打开相应的项目,再次编译即可。


参考资料:

为osgText::Text设置旋转

使用void setRotation(const osg::Quat &quat)方法。

这里要注意的是,该方法永远是从这样一个状态开始的:文字在X、Y轴决定的平面内,面对Z轴的正方向。

不要以为你之前设置了setAxisAlignment (AxisAlignment axis),就以为从这个平面开始旋转。看源码可以知道,该方法内部使用的也是setRotation方法。


参考资料