如何使用OSG制作Blender坐标轴样式?

编程入门 行业动态 更新时间:2024-10-14 16:19:41

如何使用OSG制作Blender<a href=https://www.elefans.com/category/jswz/34/1754383.html style=坐标轴样式?"/>

如何使用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坐标轴样式?

本文发布于:2024-02-27 13:54:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1706809.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:坐标轴   如何使用   样式   Blender   OSG

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!