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

本文介绍了如何使用OSG库创建类似Blender的坐标轴效果。首先展示了最终效果,接着讲解了官方坐标轴的实现,然后通过创建HUDCamera并绘制坐标轴线及添加轴点,详细阐述了自定义坐标轴的过程。最后展示了完成后的成果图。
摘要由CSDN通过智能技术生成


  在使用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::Camera> hudCamera = new osg::Camera(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值