问题描述
今天我发现网友们竞然在透视投影和正交投影切换上存在问题,不知道怎么切,而且切出来问题很多。说良心话我就不是特别理解,因为这就是一句话的事情呀,我写出这个例子:双击,当前是透视就转成正交,当前是正交就转成透视。
本节资源
本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹。
注意: 务必使用浏览器打开:
【击此打开网盘资源链接】
关键实现
我写了个事件处理,响应了双击事件,捕获后当前是透视投影就转成正交投影,当前是正交投影就转成透视投影,我的窗口长宽比是1:1.3:
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
osgViewer::Viewer* viewer = (osgViewer::Viewer*)(&aa);
if (ea.getEventType() == ea.DOUBLECLICK)
{
if (_isPerspective)
{
viewer->getCamera()->setProjectionMatrixAsOrtho(-20*1.3, 20*1.3, -20, 20, 0, 1000);
}
else
{
viewer->getCamera()->setProjectionMatrixAsPerspective(30, 1.3, 0.1, 100);
}
_isPerspective = !_isPerspective;
}
return false;
}
以下是全部代码
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventHandler>
class MyEventHandler : public osgGA::GUIEventHandler
{
public:
MyEventHandler()
{
_isPerspective = true;
}
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
osgViewer::Viewer* viewer = (osgViewer::Viewer*)(&aa);
if (ea.getEventType() == ea.DOUBLECLICK)
{
if (_isPerspective)
{
viewer->getCamera()->setProjectionMatrixAsOrtho(-20*1.3, 20*1.3, -20, 20, 0, 1000);
}
else
{
viewer->getCamera()->setProjectionMatrixAsPerspective(30, 1.3, 0.1, 100);
}
_isPerspective = !_isPerspective;
}
return false;
}
bool _isPerspective;
};
int main(int argc, char** argv)
{
osgViewer::Viewer viewer;
viewer.setSceneData(osgDB::readNodeFile("cow.osg"));
viewer.addEventHandler(new MyEventHandler());
viewer.run();
return 0;
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END