游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5381|回复: 2

新人求助,setWorldGeometry在调试中提示Ogre::InvalidParametersExc

[复制链接]

22

主题

98

帖子

98

积分

注册会员

Rank: 2

积分
98
QQ
发表于 2010-2-24 13:31:00 | 显示全部楼层 |阅读模式
小弟刚开始接触Ogre,才看了两天《Ogre 3D程序设计》额。。。看到第五章通过例子了解场景管理器的时候我也试着写了下代码,但是调试到sceneMgr -> setWorldGeometry(terrain_cfg);这句时出错,提示Ogre::InvalidParametersException。例子里的Terrain是可以运行的。这是怎么回事呢?

我的代码:
#include "stdafx.h"
#include "MyFrameListener.h"
#include <string>
using namespace Ogre;
RenderWindow * window;
Root *root;
Camera * cam;
void createResource()
{
        ConfigFile cf;
        cf.load("resources.cfg");
        // Go through all sections & settings in the file
        ConfigFile::SectionIterator seci = cf.getSectionIterator();
        String secName, typeName, archName;
        while (seci.hasMoreElements())
        {
                secName = seci.peekNextKey();
                ConfigFile::SettingsMultiMap *settings = seci.getNext();
                ConfigFile::SettingsMultiMap::iterator i;
                for (i = settings->begin(); i != settings->end(); ++i)
                {
                        typeName = i->first;
                        archName = i->second;
                        ResourceGroupManager::getSingleton().addResourceLocation(
                                archName, typeName, secName);
                }
        }
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
{
        root=new Root();
        createResource();
        MyFrameListener *myListener=new MyFrameListener();
        SceneManager *sceneMgr=root->createSceneManager(ST_EXTERIOR_CLOSE,"MainSceneManager");
        if(root->showConfigDialog())
        {
        root->initialise(true, "test");
        window =root->getAutoCreatedWindow ();
        cam = sceneMgr ->createCamera("MainCamera");
        cam->setNearClipDistance(5);
        cam->setFarClipDistance(1000);
        cam->setAspectRatio(Real(1.333333));
        cam->lookAt(Vector3(0,0,0));
        Viewport * vp = window->addViewport(cam);
        root->addFrameListener(myListener);
        ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
        ColourValue fadeColour(0.93, 0.86, 0.76);

        sceneMgr->setFog( FOG_LINEAR, fadeColour,0.001, 500, 1000);
        window->getViewport(0)->setBackgroundColour(fadeColour);

        std::string terrain_cfg("terrain.cfg");
        sceneMgr -> setWorldGeometry(terrain_cfg);

        if (root->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
        {
                cam->setFarClipDistance(0);
        }
        Plane plane;

        plane.d = 5000;

        plane.normal = -Vector3::UNIT_Y;


        sceneMgr->setSkyPlane(true, plane, "Examples/CloudySky");

        cam->setPosition(707,2500,528);

        cam->lookAt(0, 0, 0);

        sceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
        Light* l = sceneMgr->createLight("MainLight");
        l->setPosition(20,80,50);
        while(true)
        {
                WindowEventUtilities::messagePump();
                gameMain();
                if(!root->renderOneFrame())
                        break;
        }
        }
        delete myListener;
        delete root;
        return 0;
}

22

主题

98

帖子

98

积分

注册会员

Rank: 2

积分
98
QQ
 楼主| 发表于 2010-2-24 16:36:00 | 显示全部楼层

Re:新人求助,setWorldGeometry在调试中提示Ogre::InvalidParameters

把SceneManager *sceneMgr=root->createSceneManager(ST_EXTERIOR_CLOSE,"MainSceneManager");放到root->initialise(true, "test");后面解决了

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2012-9-17 09:33:00 | 显示全部楼层

Re:新人求助,setWorldGeometry在调试中提示Ogre::InvalidParameters

是不是使用了新版1.8的啊,我昨天也遇到创建室外管理器再添加地形时出错,mSceneMgr=root->createSceneManager(ST_EXTERIOR_CLOSE,"MainSceneManager");可能是这里没有实现到,使用了默认的ST_GENERIC类型场景管理器,默认的ST_GENERIC类型场景管理器在调用mSceneMgr->setWorldGeometry( "terrain.cfg" );时会调用OgreSceneManager.cpp里场景管理器里的
void SceneManager::setWorldGeometry(const String& filename)
{
    // This default implementation cannot handle world geometry
    OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
        "World geometry is not supported by the generic SceneManager.",
        "SceneManager::setWorldGeometry");
}
并没有调用其派生类的此方法,而基类的方法是抛出异常不实现的,我也是初学Ogre 暂时未深入了解时什么原因,希望有高手解答下吧,幸好我在一个群里听到有人说是新版本的问题,我换了1.7.4的一试果真如此,初学的还是先用旧版的吧,毕竟教程都是旧版的多~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-27 16:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表