用Ogre实现画中画 [ 截图 ]

转载自:http://www.cppblog.com/richardhe/articles/57983.html

在玩一些3D游戏的时候,经常会有画中画的功能,比如“跑跑卡丁车”、“杀手十三”等等,于是想自己动手试验一下。

普 通情况下,我们使用单一的摄像机,实现第一人称或者第三人称,有时我们用多个摄像机在单一的窗口中切换视角,比如从第一人称切换到第三人称视角(游戏中屡 见不鲜),而画中画将会同时展现第一人称和第三人称(或者第三人称与第三人称),也就是说同时存在不同的观察点,这就需要多窗口多摄像机分别进行渲染。

用Ogre实现画中画功能是件比较容易的事情,首先,搭建一个普通的场景,关于这方面的工作www.ogre3d.org/wiki里有详细的教程,不赘述了。

下面进入关键部分。

在Ogre里摄像机Camera和视口Viewport是一一对应的关系,普通情况下包含一个摄像机对应一个视口,我们只要添加摄像机和与之对应的视口就OK了!

我的窗口类里是这样配置Ogre的,基本和教程示例里的一样。

bool BaseApplication::setup(void)
{
    mRoot = new Root();
    // 设置资源
    setupResources();
    // 配置渲染窗口
    bool carryOn = configure();
    if (!carryOn) 
        return false;

    // 创建场景管理器
    chooseSceneManager();
    // 创建摄像机
    createCamera();
    // 创建视口
    createViewports();
    // 设置缺省 mipmap 等级
    TextureManager::getSingleton().setDefaultNumMipmaps(5);
    // 创建所有资源监听器(为了加载屏幕)
    createResourceListener();
    // 加载资源
    loadResources();
    // 创建场景
    createScene();
    // 创建帧监听器
    createFrameListener();

    return true;
}

其中,createCamera(); // 创建摄像机 和 createViewports(); // 创建视口 是我们需要关心的。

createCamera():

void BaseApplication::createCamera(void)
{
 // 主窗口摄像机
 mCamera_1 = mSceneMgr->createCamera("Cam_1");
 mCamera_1->setPosition(Vector3(0,0,300));
 mCamera_1->lookAt(Vector3(0,0,-300));
 mCamera_1->setNearClipDistance(5);

 // 画中画摄像机
 mCamera_2 = mSceneMgr->createCamera("Cam_2");
 mCamera_2->setPosition(Vector3(100,100,300));
 mCamera_2->lookAt(Vector3(-100,-100,-300));
 mCamera_2->setNearClipDistance(5);
}

createViewports():

void BaseApplication::createViewports(void)
{
    // 主窗口
    Viewport* vp_1 = mWindow->addViewport( mCamera_1 );
    vp_1->setBackgroundColour( ColourValue(0,0,0) );
    mCamera_1->setAspectRatio(Real( vp_1->getActualWidth() ) / Real( vp_1->getActualHeight() ) );

    // 画中画
    Viewport* vp_2 = mWindow->addViewport( mCamera_2, 1, 0.7, 0.05, 0.25, 0.25 );
    vp_2->setBackgroundColour( ColourValue(0,0,0) );
    vp_2->setOverlaysEnabled(false);
    mCamera_2->setAspectRatio(Real( vp_2->getActualWidth() ) / Real(vp_2->getActualHeight() ) );
}

在addViewport中我们控制画中画视口在主窗口中的位置和大小(注意这里是0~1的取值范围,类似于贴图坐标)

这样就实现了下图所示效果的一半了。
这里写图片描述
是不是很酷?如果进一步设计成,当触发某一事件时将画中画窗口动态的弹出,那就更酷了!有兴趣的可以试一试:P

如图所示,我另外还利用了CEGUI给画中画窗口加了个边框,并且带了一个combobox用来控制更多摄像机之间的切换,CEGUI是用脚本来定义界面的,实现也比较简单。有关CEGUI部分的介绍,在ogre wiki上有更详细的教程。

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值