用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
用Ogre实现画中画 [ 截图 ]相关推荐
- (转)修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了 ...
- 报告视频录制:腾讯会议录屏+人像画中画特效
想录制PPT报告.软件操作,有什么免费的软件吗?腾讯会议即可,不仅完全免费,无时间限制,甚至支持人像实时扣图悬浮于桌面上(人像画中画). 视频1. 录制全过程操作 https://v.qq.com/x ...
- ffmpeg 同宽度 画中画_FFmpeg中overlay滤镜用法-水印及画中画
1. overlay 技术简介 overlay 技术又称视频叠加技术.overlay 视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能.画中画是指在一个大的视频播放窗 ...
- AVFoundation – AVAssetImageGenerator 截图
目录 一.前言 1.AVAsset 2.AVAssetTrack 3.AVComposition / AVMutableComposition 4.AVMutableVideoComposition ...
- ogre研究之第一个程序(一)
第一次发送超过字数了,被迫剪成两篇! 上一篇我们介绍了如何搭建开发环境,并创建了一个空白的窗口程序. 这里我们主要是实现在程序中装载一个简单的模型并显示出来. 首先看一下效果吧,(模型就是ogre例子 ...
- Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.
在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点 ...
- 基于Ogre的DeferredShading(延迟渲染)的实现以及应用
三年前开始接触ogre引擎,由于工作需要一直进行图形方面的研发和尝试,随着引擎技术的进步,ogre的与Cryengine3.Unreal3等一线图形引擎在画面上的差距越来越大,主要原因在于ogre目前 ...
- android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...
android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...
- Unity 截取3D图像 与 画中画PIP的实现
1 前言 在Unity中要得到某些3D游戏对象的截图,是比较容易的,本文来讨论一下. 实现的核心方案,是新建一个Camera,Camera指向目标对象.Camera有个参数是TargetTexture ...
最新文章
- hdu2852(2009多校第四场) 树状数组求区间第k大的数 两种方法
- 【linux高级程序设计】(第十五章)UDP网络编程应用 2
- matlab-基础 size 获取矩阵的行数与列数
- 兵团职称计算机准考证查询,兵团初级会计准考证打印入口官网
- 视觉SLAM十四讲(2):初识SLAM
- 动手学无人驾驶(4):基于激光雷达点云数据3D目标检测
- 面试必会之LinkedList源码分析
- BZOJ5336 TJOI2018 party 【状压DP】*
- git21天打卡-day5 day6 day7
- 北斗导航:太空中最亮的“中国星”
- 创建Web站点的欢迎页面
- Semantic UI学习(一、开始使用)
- 新媒体中的淘宝电商运营资源
- 2019年的计划,做最好的自己。
- google不能用解决方法
- 数据仓库数据存储与处理
- Ubuntu虚拟机中网络中没有网卡
- 实现对文件夹进行加密
- 谷歌地图应用——基础篇之入门
- 配置OpenStack准备环境