osg透视投影与正交投影的切换

主要是希望在切换的时候保持等距的转换,即使在发生缩放后。
首先osg中有获取与设置投影矩阵的方法,因此简单的转换如下:

	case osgGA::GUIEventAdapter::DOUBLECLICK:
	{
		if (m_isPerspective)
		{
			double left,right,bottom,top,zNear, zFar;
			m_pViewer->getCamera()->getProjectionMatrixAsFrustum(left, right, bottom, top, zNear, zFar);
			m_pViewer->getCamera()->setProjectionMatrixAsOrtho(left, right, bottom, top, zNear, zFar);
		}
		else
		{
			double left, right, bottom, top, zNear, zFar;
			m_pViewer->getCamera()->getProjectionMatrixAsOrtho(left, right, bottom, top, zNear, zFar);
			m_pViewer->getCamera()->setProjectionMatrixAsFrustum(left, right, bottom, top, zNear, zFar);
		}
		m_isPerspective = !m_isPerspective;
	}
	return false;

这部分写在了自定义的漫游器的handle方法中,在写demo测试的时候呈现的效果已经是等距的了,但是放到实际项目中却不行,发现实际项目中在创建camera的时候初始化了透视投影矩阵:

setProjectionMatrixAsPerspective(30.0f, double(traits->width) / double(traits->height), 1.0f, 1000.0f);

然后感觉 转换效果和 近平面与_distance的比值 有关 :
在这里插入图片描述
初始化时的近平面设置为了1.0,因此比值刚好是_distance,修改后的切换如下:

if (m_isPerspective)
	{
		m_pViewer->getCamera()->getProjectionMatrixAsFrustum(m_left, m_right, m_bottom, m_top, m_zNear, m_zFar);
		double v = _distance / m_zNear;
		m_pViewer->getCamera()->setProjectionMatrixAsOrtho(m_left * v, m_right * v, m_bottom * v, m_top * v, m_zNear, m_zFar);
	}
	else
	{
		double left, right, bottom, top, zNear, zFar;
		m_pViewer->getCamera()->getProjectionMatrixAsOrtho(left, right, bottom, top, zNear, zFar);
		double distance = left / m_left * zNear;
		m_pViewer->getCamera()->setProjectionMatrixAsFrustum(m_left, m_right, m_bottom, m_top, m_zNear, m_zFar);
		_distance = distance;
	}
	m_isPerspective = !m_isPerspective;

正交投影下的缩放我是通过修改投影矩阵的方式,没有去修改_distance,因此切换到透视投影的时候需要计算_distance并设置。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值