第25节 实例-透视投影和正交投影切换

问题描述

今天我发现网友们竞然在透视投影和正交投影切换上存在问题,不知道怎么切,而且切出来问题很多。说良心话我就不是特别理解,因为这就是一句话的事情呀,我写出这个例子:双击,当前是透视就转成正交,当前是正交就转成透视。

本节资源

本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹。

注意: 务必使用浏览器打开:
【击此打开网盘资源链接】

关键实现

我写了个事件处理,响应了双击事件,捕获后当前是透视投影就转成正交投影,当前是正交投影就转成透视投影,我的窗口长宽比是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
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片