⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp.txt

📁 摄像机类
💻 TXT
字号:
#include "osgTest.h"

osgTest::osgTest():m_fMoveSpeed(1.5f),
				   m_bRButtonDown(false),
				   m_fpushX(0),
				   m_fpushY(0),
				   M_fAngle(2.5),
				   m_bPeng(true)
{
	m_vPosition = osg::Vec3(15.0f,-130.0f,3.0f);
	m_vRotation = osg::Vec3(osg::PI_2,0.0f,0.0f);
}		   

osgTest::~osgTest()
{

}

void osgTest::setByMatrix(const osg::Matrixd& matrix)
{

}

void osgTest::setByInverseMatrix(const osg::Matrixd& matrix)
{

}

osg::Matrixd osgTest::getMatrix(void) const
{
	osg::Matrixd mat;
	mat.makeRotate(m_vRotation._v[0],osg::Vec3(1.0f,0.0f,0.0f),
				   m_vRotation._v[1],osg::Vec3(0.0f,1.0f,0.0f),
				   m_vRotation._v[2],osg::Vec3(0.0f,0.0f,1.0f));

	return mat * osg::Matrixd::translate(m_vPosition);
}

osg::Matrixd osgTest::getInverseMatrix(void) const
{
	osg::Matrixd mat;
	mat.makeRotate(m_vRotation._v[0],osg::Vec3(1.0f,0.0f,0.0f),
		m_vRotation._v[1],osg::Vec3(0.0f,1.0f,0.0f),
		m_vRotation._v[2],osg::Vec3(0.0f,0.0f,1.0f));

	return osg::Matrixd::inverse(mat * osg::Matrixd::translate(m_vPosition));
}

bool osgTest::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us)
{
	float mouseX = ea.getX();
	float mouseY = ea.getY();

	switch(ea.getEventType())
	{
	case(osgGA::GUIEventAdapter::KEYDOWN):
		{
			if (ea.getKey() == 0x20)
			{
				us.requestRedraw();
				us.requestContinuousUpdate(false);
				return true;
			}

			if (ea.getKey() == 0xFF50)
			{
				ChangePosition(osg::Vec3(0,0,m_fMoveSpeed));
				return true;
			}

			if (ea.getKey() == 0xFF57)
			{
				ChangePosition(osg::Vec3(0,0,-m_fMoveSpeed));
				return true;
			}

			if (ea.getKey() == 0x2B)
			{
				m_fMoveSpeed += 1.0f;
				return true;
			}

			if (ea.getKey() == 0x2D)
			{
				m_fMoveSpeed -= 1.0f;
				if (m_fMoveSpeed < 1.0f)
				{
					m_fMoveSpeed = 1.0f;
				}
				return true;
			}

			if (ea.getKey() == 0xFF52 || ea.getKey() == 0xFF57 || ea.getKey() == 0xFF77)
			{
				ChangePosition(osg::Vec3(0,m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation._v[2]),0));
				ChangePosition(osg::Vec3(m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0,0));
				return true;
			}

			if (ea.getKey() == 0xFF54 || ea.getKey() == 0xFF53 || ea.getKey() == 0xFF73)
			{
				ChangePosition(osg::Vec3(0,-m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation._v[2]),0));
				ChangePosition(osg::Vec3(-m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0,0));
				return true;
			}

			if (ea.getKey() == 0x41 || ea.getKey() == 0xFF61)
			{
				ChangePosition(osg::Vec3(0,m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation._v[2]),0));
				ChangePosition(osg::Vec3(-m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0,0));
				return true;
			}

			if (ea.getKey() == 0x44 || ea.getKey() == 0xFF64)
			{
				ChangePosition(osg::Vec3(0,-m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation._v[2]),0));
				ChangePosition(osg::Vec3(m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0,0));
				return true;
			}

			if (ea.getKey() == 0xFF53)
			{
				m_vRotation._v[2] -= osg::DegreesToRadians(M_fAngle);
			}

			if (ea.getKey() == 0xFF51)
			{
				m_vRotation._v[2] += osg::DegreesToRadians(M_fAngle);
			}

			if (ea.getKey() == 0x48 || ea.getKey() == 0x68)
			{
				M_fAngle -= 0.2;
				return true;
			}

			if (ea.getKey() == 0x48 || ea.getKey() == 0x68)
			{
				M_fAngle += 0.2;
				return true;
			}
			return false;
		}
	case(osgGA::GUIEventAdapter::PUSH):
		if (ea.getButton() == 2)
		{
			m_fpushX = mouseX;
			m_fpushY = mouseY;
			m_bRButtonDown = true;
		}
		return false;
	case(osgGA::GUIEventAdapter::DRAG):
		if (m_bRButtonDown)
		{
			m_vRotation._v[2] -= osg::DegreesToRadians(M_fAngle * (mouseX - m_fpushX));
			m_vRotation._v[0] += osg::DegreesToRadians(1.1 * (mouseY - m_fpushY));

			if (m_vRotation._v[0] >= 3.14)
			{
				m_vRotation._v[0] = 3.14;
			}

			if (m_vRotation._v[0] <= 0)
			{
				m_vRotation._v[0] = 0;
			}
		}
		return false;
	case(osgGA::GUIEventAdapter::RELEASE):
		if (ea.getButton() == 2)
		{
			m_bRButtonDown = false;
		}
		return false;
	default:
		return false;
	}
}

void osgTest::ChangePosition(osg::Vec3& delta)
{
	if (m_bPeng)
	{
		osg::Vec3 newPos = m_vPosition + delta;

		osgUtil::IntersectVisitor iv;

		osg::ref_ptr<osg::LineSegment>line = new osg::LineSegment(newPos,m_vPosition);
		osg::ref_ptr<osg::LineSegment>lineZ = new osg::LineSegment(newPos + osg::Vec3(0.0f,0.0f,m_fMoveSpeed),newPos - osg::Vec3(0.0f,0.0f,m_fMoveSpeed));

		iv.addLineSegment(lineZ.get());
		iv.addLineSegment(line.get());

		m_viewer.getSceneData()->accept(iv);

		if (!iv.hits())
		{
			m_vPosition += delta;
		}
	}else{
		m_vPosition += delta;
	}
}

void osgTest::setSpeed(float& sp)
{
	m_fMoveSpeed = sp;
}

float osgTest::getSpeed()
{
	return m_fMoveSpeed;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -