坐标轴样式?"/>
如何使用OSG制作Blender坐标轴样式?
使用OSG制作Blender坐标轴样式
- 效果示意
- 官方坐标轴效果
- HUDCamera
- 坐标轴线的绘制
- 添加X Y Z -X -Y -Z点
- 成果图
在使用OSG进行开发的过程中,我们需要使用坐标轴来让界面中的模型或者点云在旋转的时候可以更加直观的显示旋转的方向,那么我们就要添加一个坐标轴相机来对坐标轴模型进行加载,官方也有坐标轴文件“axes.osgt”进行加载显示,但是效果比较普通,那么我们怎样来自定义呢?
效果示意
先上最终效果图,下面我们再一步一步来制作。
官方坐标轴效果
HudCallback
类主要是接收界面矩阵变化的回调事件,用于时实同步主界面相机旋转参数,并对坐标轴参数进行同步的方法。
class HudCallback : public osg::NodeCallback
{
public:HudCallback(osgViewer::Viewer* viewer) : m_viewer(viewer){}~HudCallback(){m_viewer.release();}virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){osg::ref_ptr<osg::MatrixTransform> pTM = dynamic_cast<osg::MatrixTransform*>(node);if (pTM){osg::ref_ptr<osg::Camera> camera = m_viewer->getCamera();osg::Vec3 translate = pTM->getMatrix().getTrans();osg::Vec3 scale = pTM->getMatrix().getScale();osg::Matrix mv = camera->getViewMatrix();mv.setTrans(translate);pTM->setMatrix(osg::Matrix::scale(scale) * mv);}}
private:osg::ref_ptr<osgViewer::Viewer> m_viewer;
};
创建一个坐标轴相机,将返回的相机节点加入到主界面就可以了。
osg::ref_ptr<osg::Camera> createHudCamera(osgViewer::Viewer* viewer, int width, int height)
{osg::ref_ptr<osg::Camera> hudCamera = new osg::Camera();hudCamera->setProjectionMatrixAsOrtho(0, width, 0, height, 1, 100);hudCamera->setRenderOrder(osg::Camera::POST_RENDER);hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT);osg::ref_ptr<osg::MatrixTransform> axes = new osg::MatrixTransform();QString baseurl = QCoreApplication::applicationDirPath().append("/axes.osgt");osg::Node* axes_node = osgDB::readNodeFile(baseurl.toStdString());if (axes_node == NULL){QMessageBox::information(NULL, "", QString::fromUtf8(u8"未找到坐标轴模型文件"));return NULL;}axes->addChild(axes_node);axes->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);axes->setMatrix(osg::Matrix::scale(osg::Vec3(width / 20., width / 20., width / 20.))* osg::Matrix::translate(osg::Vec3(width / 20., width / 20., 1.)));axes->setUpdateCallback(new HudCallback(viewer));hudCamera->addChild(axes.get());return hudCamera;
}
上面的示例是官方默认坐标轴加载效果,如果想要改变坐标轴的样式,我们需要对axes.osgt
文件进行建模并重新导出,但是对于不会建模的同学来说可能就有一点难度了,而且模型格式相互转换也相对麻烦,所以下面我们就用OSG的节点来自定义一个坐标轴。
HUDCamera
创建一个HudCamera
osg::ref_ptr<osg::Camera> createHudCamera(osgViewer::Viewer* viewer, int width, int height)
{osg::ref_ptr
更多推荐
如何使用OSG制作Blender坐标轴样式?
发布评论