转载自: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

用Ogre实现画中画 [ 截图 ]相关推荐

  1. (转)修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)

    本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了 ...

  2. 报告视频录制:腾讯会议录屏+人像画中画特效

    想录制PPT报告.软件操作,有什么免费的软件吗?腾讯会议即可,不仅完全免费,无时间限制,甚至支持人像实时扣图悬浮于桌面上(人像画中画). 视频1. 录制全过程操作 https://v.qq.com/x ...

  3. ffmpeg 同宽度 画中画_FFmpeg中overlay滤镜用法-水印及画中画

    1. overlay 技术简介 overlay 技术又称视频叠加技术.overlay 视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能.画中画是指在一个大的视频播放窗 ...

  4. AVFoundation – AVAssetImageGenerator 截图

    目录 一.前言 1.AVAsset 2.AVAssetTrack 3.AVComposition / AVMutableComposition 4.AVMutableVideoComposition ...

  5. ogre研究之第一个程序(一)

    第一次发送超过字数了,被迫剪成两篇! 上一篇我们介绍了如何搭建开发环境,并创建了一个空白的窗口程序. 这里我们主要是实现在程序中装载一个简单的模型并显示出来. 首先看一下效果吧,(模型就是ogre例子 ...

  6. Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.

    在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点 ...

  7. 基于Ogre的DeferredShading(延迟渲染)的实现以及应用

    三年前开始接触ogre引擎,由于工作需要一直进行图形方面的研发和尝试,随着引擎技术的进步,ogre的与Cryengine3.Unreal3等一线图形引擎在画面上的差距越来越大,主要原因在于ogre目前 ...

  8. android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...

    android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...

  9. Unity 截取3D图像 与 画中画PIP的实现

    1 前言 在Unity中要得到某些3D游戏对象的截图,是比较容易的,本文来讨论一下. 实现的核心方案,是新建一个Camera,Camera指向目标对象.Camera有个参数是TargetTexture ...

最新文章

  1. hdu2852(2009多校第四场) 树状数组求区间第k大的数 两种方法
  2. 【linux高级程序设计】(第十五章)UDP网络编程应用 2
  3. matlab-基础 size 获取矩阵的行数与列数
  4. 兵团职称计算机准考证查询,兵团初级会计准考证打印入口官网
  5. 视觉SLAM十四讲(2):初识SLAM
  6. 动手学无人驾驶(4):基于激光雷达点云数据3D目标检测
  7. 面试必会之LinkedList源码分析
  8. BZOJ5336 TJOI2018 party 【状压DP】*
  9. git21天打卡-day5 day6 day7
  10. 北斗导航:太空中最亮的“中国星”
  11. 创建Web站点的欢迎页面
  12. Semantic UI学习(一、开始使用)
  13. 新媒体中的淘宝电商运营资源
  14. 2019年的计划,做最好的自己。
  15. google不能用解决方法
  16. 数据仓库数据存储与处理
  17. Ubuntu虚拟机中网络中没有网卡
  18. 实现对文件夹进行加密
  19. 谷歌地图应用——基础篇之入门
  20. 配置OpenStack准备环境

热门文章

  1. 高仿《ONE一个》安卓APP
  2. OSChina 周三乱弹 —— 国家命运与个人命运
  3. cxfreeze 打包exe
  4. 推荐一款简单易用线上引流测试工具:GoReplay
  5. CoreData基础
  6. phpstudy打不开localhost【已解决】
  7. Python数据可视化第 9 讲:matplotlib极坐标图绘制函数polar
  8. 浅谈Lattepanda
  9. linux 添加动态链接库的方法
  10. 论文解读:K-BERT:Enabling Language Representation with Knowledge Graph(AAAI-20)