📄 cpp.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 + -