[ 试验 ] 用Ogre实现画中画 [ 截图 ]

在玩一些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
 

posted on 2007-05-22 10:59 hitmaen 阅读(4610) 评论(4)  编辑 收藏 引用 所属分类: Ogre

评论

# re: [ 试验 ] 用Ogre实现画中画 [ 截图 ] 2007-05-22 16:14 万连文

鹰眼,小地图??  回复  更多评论   

# re: [ 试验 ] 用Ogre实现画中画 [ 截图 ] 2007-05-22 19:05 hitmaen

@万连文
鹰眼是什么?不是指小地图,玩一玩跑跑卡丁车就明白我说的画中画是什么了  回复  更多评论   

# re: [ 试验 ] 用Ogre实现画中画 [ 截图 ] 2009-08-18 17:11 luj

楼主能不能提供一下全部的代码呢?  回复  更多评论   

# re: [ 试验 ] 用Ogre实现画中画 [ 截图 ] 2009-08-19 08:59 luj

我的邮箱是d04421024@163.com,呵呵,谢谢  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(1)

随笔分类(9)

随笔档案(9)

OGRE

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜