ããã«ã¡ã¯
æã匷åãªã¬ã³ããªã³ã°ãšã³ãžã³
Ogre3Dã® 1ã€
ã«é¢ãã Haberã® è峿·±ã èšäºã
ããã€ãèªãã§ã倧æ°å¹æãæ°Žé¢ãç·è±ããªæ€çã®ããçŸå®çãªé¢šæ¯ã䜿çšããã¢ããªã³ã°ã®çµéšãå
±æããããšã«ããŸããã ã«ããã®äž-ããã«å¿
èŠãªãã¹ãŠã®ã©ã€ãã©ãªãOgreã«ãã蟌ãããã®ã¬ã·ãã
ä»åŸãæçµçµæã¯æ¬¡ã®ããã«ãªããŸãã



å¿
èŠãªã©ã€ãã©ãªã¯æ¬¡ã®ãšããã§ãã
ã¹ããã1ïŒã¢ããªã±ãŒã·ã§ã³ã¹ã±ã«ãã³
ã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ã«ãã³ãšããŠããããã«å€æŽããã
Ogre Wikiãã¥ãŒããªã¢ã«ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸããããã¯ãå°ããªè€éãªã¢ããªã±ãŒã·ã§ã³ãäœæããã®ã«ååãªæè»æ§ããããããogre-wikiã®ã¬ã€ãã®å
±éãã¬ãŒã ã¯ãŒã¯ã§ãã ããã«ãéåžžã«å€ãã®æ©èœãç¹ã«WASDããŒã«æ²¿ã£ãã«ã¡ã©ã®ç§»åãããŠã¹ã®ã¬ãã¥ãŒãFPSã«ãŠã³ã¿ãŒãªã©ã®äŸ¿å©ãªæ©èœãå«ãŸããŠããŸãã ã³ã³ãã€ã«ã«ã¯ãMicrosoft Visual C ++ 2008ãšCMakeãã«ãã·ã¹ãã ã䜿çšããŸããïŒåŸè
ã䜿çšãããšãOgreããµããŒãããä»»æã®ã¢ãŒããã¯ãã£ã§ãããžã§ã¯ããã³ã³ãã€ã«ã§ããŸãïŒã
ãã¹ãŠã®ãœãŒã¹ã
Githubã«æçš¿ããŸããïŒãã ããgitãæ··ä¹±ãããªãããã«ã
ãã®ã¢ãã¬ã¹ããããŠã³ããŒãã§ããŸãïŒã ã³ã³ãã€ã«ã«ã¯ã
2008th studio
Ogreã«ãã£ãŠäºåã«çµã¿ç«ãŠããããã©ã³ã1.7ãš
CMakeãå¿
èŠã§ãã åŸè
ãOgreãæ£ããèŠã€ããããã«ã¯ã
OGRE_HOME
ç°å¢å€æ°ãããããã€ã³ã¹ããŒã«ãããŠãããã£ã¬ã¯ããªãšåãããã«è¿œå ããå¿
èŠããããŸãã
ããã«ããã¹ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã«ã¯ã2ã€ã®ã¢ãŒã«ã€ããå¿
èŠã§ãããã¯ã¹ãã£ãã¢ãã«ãããã³ãã®ä»ã®å¿
èŠãªãã®ãå«ã
media.zipã¯ããããžã§ã¯ããã£ã¬ã¯ããªã«çŽæ¥å±éããå¿
èŠããããŸãã
configs.zipã«ã¯ ãOgreæ§æãã¡ã€ã«ãå«ãŸããŠããŸãããããã¢ã»ã³ããªãã£ã¬ã¯ããªã«è§£åããå¿
èŠããããŸãã
ãããžã§ã¯ããã³ã³ãã€ã«ããã«ã¯ããŸãCMake GUIãå®è¡ãã
ããœãŒã¹ã³ãŒãã®å Žæããã£ãŒã«ãã§ãããžã§ã¯ããã£ã¬ã¯ããªãéžæãã
ããã€ããªã®ãã«ãå Žæããã£ãŒã«ãã§-ä»»æãããšãã°ããããžã§ã¯ããã£ã¬ã¯ããªã®ãã«ããµããã£ã¬ã¯ããªãéžæã§ããŸãã æ¬¡ã«ã[
æ§æ ]ãã¿ã³ãã¯ãªãã¯ããã³ã³ãã€ã©ã®ãªã¹ãã§Visual Studio 2008ãéžæããŸãããã¹ãŠãããŸããããCMakeãäœãååšããªããšèªããªãã£ãå Žåã¯ã[
çæ ]
ãã¯ãªãã¯ããŸãã

ãã®çµæãVisual Studio LandscapeApp.slnãœãªã¥ãŒã·ã§ã³ãã¡ã€ã«ããã«ããã£ã¬ã¯ããªã«è¡šç€ºãããŸãããã®ãã£ã¬ã¯ããªã䜿çšããŠãã³ãŒãã倿Žãããã¹ããããžã§ã¯ããã³ã³ãã€ã«ããã³å®è¡ã§ããŸãã
å®éãã³ã³ãã€ã«ãšèµ·ååŸãæšæºã®Ogreã¬ã³ããªã³ã°ãµãã·ã¹ãã éžæãŠã£ã³ããŠã衚瀺ãããŸãã

ããšãã°ã
Direct3D9 Rendering SubsystemãéžæããŠ[OK]ãã¯ãªãã¯ããæããã«ãªãã¹ã±ãŒã«ã§ããå€ç¬ãªFPSã«ãŠã³ã¿ãŒã®ããé»ããŠã£ã³ããŠã芳å¯ããŸã-ããã§ããã·ãŒã³ã¯äœãšã空ã§ãã ã¡ãªã¿ã«ãFããŒã§ã«ãŠã³ã¿ãŒãæããããã ãå±éãããããŠãå¹²æžããªãããã«ããããšãã§ããŸãã

ãŸããããæåãªæ¿æ²»å®¶ãèšã£ãããã«ããäž»ãªããšã¯å§ããããšã§ãïŒã
ã¹ããã2ïŒå€©åœ
Caelumã¯ãçŸåšã®æå»ãšèŠ³æž¬è
ã®åº§æšãé²ãæ°è±¡çŸè±¡ïŒéšãéªãé§ïŒãªã©ãèæ
®ããŠã空ã倪éœãæãæã®è²ãªã©ã®ãã©ããªã¢ãªã¹ãã£ãã¯ãªå€§æ°å¹æãäœæããããã®GNU Lesser GPLã©ã€ã»ã³ã¹ã®äžã§é
åžãããOgreãã©ã°ã€ã³ã§ãã dã
Google Codeã®
ãªããžããªããCaelumã®ææ°ããŒãžã§ã³ãããŠã³ããŒãããŸãã
ãã©ãŒã©ã ã®
ã¡ãã»ãŒãžãã倿ãããšããã®ãããžã§ã¯ãã«ã¯æ°ããã¡ã³ãããŒããããç¹å®ã®åãããããŸããæ°ããæ©èœããããžã§ã¯ãã«è¿œå ãããå€ããšã©ãŒãä¿®æ£ãããŸãã
hg clone https://code.google.com/p/caelum
ãã䟿å©ã«ããããã«ãå¿
èŠãªãã¹ãŠã®ãœãŒã¹ããã¹ããããžã§ã¯ãã®ããªãŒã«ã³ããŒããã³ã³ãã€ã©ã®èŠåãä¿®æ£ããããã«å°ããªå€æŽãå ããŸããã Caelumã®äœæè
ã¯CMakeãã«ãã·ã¹ãã ã䜿çšããŠããããããã«ãã·ã¹ãã ãžã®è¿œå ã¯è¡ã«éå®ãããŸã
add_subdirectory ( Caelum )
CMakeLists.txtãã¡ã€ã«ã§ã
include_directories
ã³ãã³ãã䜿çšããŠ
Caelum/main/include
ããã³
${CMAKE_BINARY_DIR}/Caelum/main/include
ãµããã£ã¬ã¯ããªããªã¹ãã«è¿œå ãã
target_link_libraries
ã³ãã³ãã䜿çšããŠãªã³ã¯ã©ã€ãã©ãªã®ãªã¹ãã«Caelumã远å ã
include_directories
ã
ã³ãŒãinclude_directories ( ${ OIS_INCLUDE_DIRS }
${ OGRE_INCLUDE_DIRS }
${ OGRE_SAMPLES_INCLUDEPATH }
"Caelum/main/include"
"${CMAKE_BINARY_DIR}/Caelum/main/include"
# ...
target_link_libraries ( LandscapeApp ${ OGRE_LIBRARIES } ${ OIS_LIBRARIES } Caelum )
ã³ãŒãèªäœã«ã¯ããå°ã倿Žãå¿
èŠã§ãã éå§ããã«ã¯ãã¡ã€ã³ã®LandscapeApplication.hppããããŒãã¡ã€ã«ã«CaelumããããŒãã¡ã€ã«ãå«ããŸãã
#include <Caelum.h>
ãããŠãLandscapeApplication.cppãœãŒã¹ã³ãŒããã¡ã€ã«ã«é©åãªããŒã ã¹ããŒã¹ãå«ããŸãã
using namespace Caelum;
ããã«ãCaelumèªäœã¯ã空ãšå€§æ°ãã¬ã³ããªã³ã°ããããã®å¥åã®ã³ã³ããŒãã³ãã®ã»ããã§ããã
CaelumSystem
ã«ãŒãã¯ã©ã¹ã«ãã£ãŠå¶åŸ¡ãããŸãã ãã®ã¯ã©ã¹ã¯ããã¹ãŠã®ã³ã³ããŒãã³ããç£èŠããå¿
èŠã«å¿ããŠå
éšç¶æ
ãæŽæ°ããŸãã ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãããããã®ãããã«ãŒã
LandscapeApplication
ã¯ã©ã¹ã«ãã€ã³ã¿ãŒã远å ããŸãã
ã³ãŒãclass LandscapeApplication : public BaseApplication
{
// ...
protected :
virtual void createScene( void );
Caelum :: CaelumSystem * mCaelumSystem;
};
createScene
ã¡ãœããã§ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸãã
void LandscapeApplication :: createScene( void )
{
mCaelumSystem = new CaelumSystem(mRoot, mSceneMgr, CaelumSystem :: CAELUM_COMPONENTS_DEFAULT);
æãéèŠãªã®ã¯æåŸã®ãã©ã¡ãŒã¿ãŒã§ããããã¯ã䜿çšããCaelumã³ã³ããŒãã³ãã瀺ã
ããããã¹ã¯ã§ãã
CAELUM_COMPONENTS_DEFAULT
ããã©ã«ãã»ããããã¹ãŠã®å®å®ããã³ã³ããŒãã³ããå«ãŸããŸãã
CaelumSystem
ãšãã®ã³ã³ããŒãã³ãã«ã¯èšå€§ãªæ°ã®èšå®ãããããã®ã»ãšãã©ã¯
get/set
ã¡ãœããã®åœ¢åŒã§ã³ãŒãããå©çšã§ãã
ããã¥ã¡ã³ãã«èšèŒãããŠã
ãŸã ã å¥ã®ããæç¢ºãªãã¥ãŒãã³ã°æ¹æ³ã¯ã3Dãšãã£ã¿ãŒ
Ogitorã§ããããã¯ãOgre
å°çšã«äœæããããã®èšäºã§èª¬æãããŠãããã¹ãŠã®ã©ã€ãã©ãªããµããŒãããŠããŸãïŒäžéšã¯èª¬æãããŠããŸããïŒã

ãã¡ã€ãã«ã¿ãã-æéã®çµéãšãšãã«å€§æ°å¹æã倿Žããã«ã¯ããã¬ãŒã ããšã«CaelumãæŽæ°ããå¿
èŠããããŸãã CaelumSystemã€ã³ã¹ã¿ã³ã¹ã
Frame Listenerããã³
Render Target Listener Ogreãªã¹ãã«è¿œå ããã ãã§ãïŒ
mCaelumSystem = new CaelumSystem(mRoot, mSceneMgr, CaelumSystem :: CAELUM_COMPONENTS_DEFAULT);
mRoot -> addFrameListener(mCaelumSystem);
mWindow -> addListener(mCaelumSystem);
åºæ¥äžãã-倪éœããã£ãããšæ¥æ²¡ã«è¿ã¥ããŠããéã空ãçããé²ãç°è²ã®é§ã«è¿ããããŸãã

ãšã³ã¿ãŒãã€ã¡ã³ããå¢ããããã«Caelumã®ãªãã·ã§ã³ã調æŽããŸãã
ã³ãŒã// ...
mWindow -> addListener(mCaelumSystem);
mCaelumSystem -> getUniversalClock() -> setTimeScale( 100 ); //
FlatCloudLayer * cloudLayer = // ,
mCaelumSystem -> getCloudSystem() -> createLayer(); // :
cloudLayer -> setCloudCover( 0.8f ); //
cloudLayer -> setCloudSpeed(Vector2( 0.0001f , 0.0001f )); //
cloudLayer -> setHeight( 5000 ); //
ãã®çµæãç©ºã¯æ¬¡ã®ããã«ãªããŸãã



å°çã®è¡šé¢ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããŠã倪éœãšæãè¡ãå Žæãæã€ããã«ãªããŸããã
ã¹ããã3ïŒå°ç
ãã€ãã£ãã®Ogreå°åœ¢ã¬ã³ããªã³ã°ãµãã·ã¹ãã ïŒ
Ogre Terrain System ïŒã䜿çšããŠãå°çã®è¡šé¢ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããŸãã ãã®ã·ã¹ãã ã¯ãOgre
Steve Streetã®äœæè
ã2009å¹Žã«æ§åŒã®å°åœ¢ã¬ã³ããªã³ã°ã¢ããªã³ã眮ãæããããã«äœæãããã®ã§ãå®å
šã«ç¬ç«ãããªãã·ã§ã³ã³ã³ããŒãã³ãã§ãïŒãã ããOgreããã±ãŒãžã«å«ãŸããããŒãžã§ã³1.7ããïŒã Ogre Terrain Systemã«ã¯ãç§ãã¡ã®ãããªå°ããªãã¹ãã¢ããªã±ãŒã·ã§ã³ãäœæããããã«å¿
èŠãªãã®ããã¹ãŠå«ãŸããŠããŸãããŸããåå¥ã®å°ããªããŒãžã§RAMã«ããŒãããã巚倧ãªäžçã«ã€ããŠã¯ãããšãã°ogreãã©ãŒã©ã ã§è©³çްã確èªã§ã
ãŸã ã ããã«ãGSoC'11ãããžã§ã¯ãã®1ã€
ã¯ãå°åœ¢ã®ããŒãžèªã¿èŸŒã¿ã¡ã«ããºã ã
æ¹åããããšã§ãã
ãŸããCMakeã«æå³ãç¥ãããŸããCMakeLists.txtãã¡ã€ã«ã§ã
target_link_libraries
ã³ãã³ãã䜿çšããŠããªã³ã¯ãããã©ã€ãã©ãªã®ãªã¹ãã«
${OGRE_Terrain_LIBRARIES}
ã远å ããŸãã
target_link_libraries ( LandscapeApp ${ OGRE_LIBRARIES } ${ OGRE_Terrain_LIBRARIES } ${ OIS_LIBRARIES } Caelum )
次ã«ã
LandscapeApplication::createScene
ã¡ãœããã«ã³ãŒãã
LandscapeApplication::createScene
ãå°åœ¢ã®1ããŒãžãããŒãããŸãïŒOgreã®ãå°åœ¢ãã®äŸããååŸããŸããïŒãããã¯ã
Ogre Basic Tutorial 3ã®ã³ãŒããšã»ãŒäžèŽããŸãã
ã³ãŒãmCamera -> setPosition(Vector3( 1683 , 50 , 2116 )); //
mCamera -> lookAt(Vector3( 1963 , 50 , 1660 ));
Vector3 lightdir( 0.55f , -0.3f , 0.75f ); //
lightdir.normalise();
Light * light = mSceneMgr -> createLight( "tstLight" );
light -> setType(Light :: LT_DIRECTIONAL);
light -> setDirection(lightdir);
light -> setDiffuseColour(ColourValue :: White);
light -> setSpecularColour(ColourValue( 0.4f , 0.4f , 0.4f ));
mTerrainGlobals = OGRE_NEW TerrainGlobalOptions; //
mTerrainGroup = OGRE_NEW TerrainGroup(mSceneMgr, //
Terrain :: ALIGN_X_Z, 513 , 12000 );
mTerrainGroup -> setOrigin(Vector3 :: ZERO);
mTerrainGlobals -> setLightMapDirection(light -> getDerivedDirection());
mTerrainGlobals -> setCompositeMapAmbient(mSceneMgr -> getAmbientLight());
mTerrainGlobals -> setCompositeMapDiffuse(light -> getDiffuseColour());
mSceneMgr -> destroyLight( "tstLight" );
mTerrainGroup -> defineTerrain( 0 , 0 ); // (0, 0)
mTerrainGroup -> loadAllTerrains( true ); // ,
mTerrainGroup -> freeTemporaryResources(); //
ãããŠãã¡ããã
mTerrainGlobals
ãš
mTerrainGroup
ãã€ã³ã¿ãŒãã¡ã€ã³ã¯ã©ã¹ã«è¿œå ããŸãã
ã³ãŒã#include <Terrain/OgreTerrain.h>
#include <Terrain/OgreTerrainGroup.h>
class LandscapeApplication : public BaseApplication
{
// ...
protected :
// ...
Ogre :: TerrainGlobalOptions * mTerrainGlobals;
Ogre :: TerrainGroup * mTerrainGroup;
};
ç¹å¥ãªãã©ã¡ãŒã¿ãŒãæå®ãããŠããªãå Žåã座æšïŒ0ã0ïŒã®ããŒãžã¯ãäžèšã®
media.zipã¢ãŒã«ã€ãã«è¿œå ããterrain_00000000.datãã¡ã€ã«ããããŒããã
ãŸã ã
çµæã¯ããããã§ãïŒ


ã¹ããã4ïŒæ°Ž
Ogre-Hydraxã®
æåœ±ã°ãªããã䜿çšããŠæ°Žé¢ãã¬ã³ããªã³ã°ããããã«æãåºã䜿çšãããŠããã©ã€ãã©ãªã¯ãGNU Lesser GPLã®äžã§ã©ã€ã»ã³ã¹ãããŠããŸãã
ãã ïŒæåã®æçš¿ã®äžéšã«ãããªã³ã¯ïŒã¢ãŒã«ã€ã
ããããŠã³ããŒã
ããŸããããã«äœæ¥ãé²ããã«ã¯ããã¹ããããžã§ã¯ãã®ããªãŒã«ã³ããŒããHydrax-v0.5.1 / Hydrax / src / Hydraxã«ã¿ãã°ãå¿
èŠã§ãã
æ®å¿µãªãããHydraxã¯CMakeãã«ãã·ã¹ãã ããµããŒãããŠããªããããHydrax / CMakeLists.txtãã¡ã€ã«ãäœæããå¿
èŠããããŸãããããœãŒã¹ãã¡ã€ã«ãšããããŒãã¡ã€ã«ãåã«äžèŠ§è¡šç€ºãããããå°ãè€éã§ãã Hydraxããã«ãã·ã¹ãã ïŒäž»ã«CMakeLists.txtïŒã«çµ±åããã«ã¯ã次ã远å ããå¿
èŠããããŸãã
ã³ãŒãinclude_directories (
# ...
"Hydrax"
)
add_subdirectory ( Hydrax )
# ...
target_link_libraries ( LandscapeApp ${ OGRE_LIBRARIES } ${ OGRE_Terrain_LIBRARIES } ${ OIS_LIBRARIES } Caelum Hydrax )
ããã«ãã¢ããªã±ãŒã·ã§ã³ã«æ°Žå¹æã远å ããã«ã¯ã
Hydrax::Hydrax
ã¯ã©ã¹ã®é©åã«åæåãããã€ã³ã¹ã¿ã³ã¹ãå¿
èŠã§ãã
ã³ãŒã// LandscapeApplication.hpp
class LandscapeApplication : public BaseApplication
{
// ...
protected :
// ...
Hydrax :: Hydrax * mHydrax;
};
// LandscapeApplication.cpp
void LandscapeApplication :: createScene( void )
{
// ...
mHydrax = new Hydrax :: Hydrax(mSceneMgr, mCamera, mWindow -> getViewport( 0 ));
Hydrax :: Module :: ProjectedGrid * mModule = new Hydrax :: Module :: ProjectedGrid( //
mHydrax, // Hydrax
new Hydrax :: Noise :: Perlin( /* */ ), //
Ogre :: Plane(Ogre :: Vector3( 0 , 1 , 0 ), Ogre :: Vector3( 0 , 0 , 0 )), //
Hydrax :: MaterialManager :: NM_VERTEX, //
Hydrax :: Module :: ProjectedGrid :: Options( 64 )); //
mHydrax -> setModule(mModule);
mHydrax -> loadCfg( "HydraxDemo.hdx" );
mHydrax -> create();
}
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãäºæããªãç»åã芳å¯ãããŸãã

æ°Žã®ä»£ããã«ã€ã³ã¯ã ã©ãããã®ïŒ
å®éãCaelumã¯Ogreã®ãã©ã°ãªãã·ã§ã³ã調æŽããŠãCaelumã䜿çšãã倧æ°ã¢ãã«ãšæãäžèŽããããã«ããŸãã ãã ãããããã®ãªãã·ã§ã³ã¯ãHydraxæ°Žãé©åã«ã¬ã³ããªã³ã°ãããªãããã«ããŸãã Caelumãªãã·ã§ã³ãå°ã
mCaelumSystem->setGlobalFogDensityMultiplier(0.01)
ïŒã€ãŸãã
mCaelumSystem->setGlobalFogDensityMultiplier(0.01)
ãšèšãããšã§ãã€ãŸããã©ã°å¯åºŠãäžãã
mCaelumSystem->setGlobalFogDensityMultiplier(0.01)
ã
mCaelumSystem->setGlobalFogDensityMultiplier(0.01)
ã«ãã£ãŠäœæãããæ°Žãå®éã«é
眮ãããŠããããšã確èªã§ããŸãã

ãã©ã°ãã©ã¡ãŒã¿ã®æ³šææ·±ã調æŽã¯ãã®èšäºã®ç¯å²ãè¶
ããŠããããããã¹ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã©ã°ããªãã«ããŸãã
void LandscapeApplication :: createScene( void )
{
// ...
cloudLayer -> setHeight( 5000 );
mCaelumSystem -> setManageSceneFog(Ogre :: FOG_NONE);
ããã§ã¯ã次ã®é©ããåŸ
ã£ãŠããŸãã

ãã®ãããªäžå¿«ãªç»åã¯ã3çªç®ã®ã¹ãããã§è¿œå ããã©ã³ãã¹ã±ãŒããéåžžã®
ãªãŒã¬ãšã³ãã£ãã£ã§ã¯ãªããšããäºå®ã®çµæã§ãããããã£ãŠãHydraxã¯æ°Žé¢ãèšç®ãããšãã«èæ
®ããŸããã ãã®ç¶æ³ãä¿®æ£ããã«ã¯ããã¬ã€ã³ãããªã¢ã«ã«æ·±åºŠ
ãã¯ããã¯ã远å
ããã ãã§ååã§ãã
void LandscapeApplication :: createScene( void )
{
// ...
mHydrax -> create();
mHydrax -> getMaterialManager() -> addDepthTechnique(
mTerrainGroup -> getTerrain( 0 , 0 ) -> getMaterial() -> createTechnique());
ãã®çµæãç®ã«æ¥œããæ¬¡ã®ç»åãåŸãããŸãã

ã¢ããªã±ãŒã·ã§ã³ãæ³šææ·±ãèŠãŠã¿ããšãCaelumãšHydraxã¯äºãã«ç¥ãããããªããšçµè«ä»ããããšãã§ããŸããããšãã°ãæ¥æ²¡åŸãæãæãåã«ã
ã³ãŒã¹ãã£ã¯ã¹ã¯æ°Žäžã«æ®ããŸãã

ããã«ãæ°Žé¢ã§ã®å€ªéœã®ãŸã¶ããã®äœçœ®ã¯ãå®éã®å€ªéœã®äœçœ®ãšã¯äžèŽããŸãããããã«ãæ¥æ²¡åŸã§ããŸã¶ããã¯æ®ããŸãã

ãã®åé¡ã解決ããããã«ãåè¿°ã®Ogitorãšãã£ã¿ãŒã®CaelumãšHydraxã®çµ±åãæ
åœãããããã«å€æŽããã
ã³ãŒãã䜿çšããŸãã
ãã// LandscapeApplication.hpp
class LandscapeApplication : public BaseApplication
{
// ...
protected :
virtual bool frameEnded( const Ogre :: FrameEvent & evt);
Ogre :: Vector3 mOriginalWaterColor;
// LandscapeApplication.cpp
void LandscapeApplication :: createScene( void )
{
// ...
mHydrax -> loadCfg( "HydraxDemo.hdx" );
mOriginalWaterColor = mHydrax -> getWaterColor();
// ...
bool LandscapeApplication :: frameEnded( const Ogre :: FrameEvent & evt)
{
Vector3 value = mCaelumSystem -> getSun() -> getSceneNode() -> _getDerivedPosition();
ColourValue cval = mCaelumSystem -> getSun() -> getBodyColour();
mHydrax -> setSunPosition(value);
mHydrax -> setSunColor(Vector3(cval.r,cval.g,cval.b));
Caelum :: LongReal mJulian = mCaelumSystem -> getUniversalClock() -> getJulianDay();
cval = mCaelumSystem -> getSunLightColour(mJulian,
mCaelumSystem -> getSunDirection(mJulian));
mHydrax -> setWaterColor(Vector3(cval.r - 0.3 , cval.g - 0.2 , cval.b));
Vector3 col = mHydrax -> getWaterColor();
float height = mHydrax -> getSunPosition().y / 10.0f ;
Hydrax :: HydraxComponent c = mHydrax -> getComponents();
if (height < 0 )
{
if (mHydrax -> isComponent(Hydrax :: HYDRAX_COMPONENT_CAUSTICS))
mHydrax -> setComponents(Hydrax :: HydraxComponent(
c ^ Hydrax :: HYDRAX_COMPONENT_CAUSTICS));
} else {
if ( ! mHydrax -> isComponent(Hydrax :: HYDRAX_COMPONENT_CAUSTICS))
mHydrax -> setComponents(Hydrax :: HydraxComponent(
c | Hydrax :: HYDRAX_COMPONENT_CAUSTICS));
}
if (height < -99.0f )
{
col = mOriginalWaterColor * 0.1f ;
height = 9999.0f ;
}
else if (height < 1.0f )
{
col = mOriginalWaterColor * ( 0.1f + ( 0.009f * (height + 99.0f )));
height = 100.0f / (height + 99.001f );
}
else if (height < 2.0f )
{
col += mOriginalWaterColor;
col /= 2.0f ;
float percent = (height - 1.0f );
col = (col * percent) + (mOriginalWaterColor * ( 1.0f - percent));
}
else
{
col += mOriginalWaterColor;
col /= 2.0f ;
}
mHydrax -> setWaterColor(col);
mHydrax -> setSunArea(height);
mHydrax -> update(evt.timeSinceLastFrame);
return true ;
}
ãã®çµæãããã³ããã¯ãªå€æ¥ãš...ããã€ãã®æ°ããã¢ãŒãã£ãã¡ã¯ããã§ããŸãã

ãŸããã«ã¡ã©ãå°å¹³ç·äžãç§»åãããšãé·ãçœãçžæš¡æ§ãçŸãããæ¶ãããããŸãã ããã¯ãæ°Žé¢ã
ãã¡ãŒã¯ãªããã³ã°ãã¬ãŒã³ ïŒ
ãã¡ãŒã¯ãªããã³ã°ãã¬ãŒã³ ïŒãšããªãè¿ãè·é¢ã§äº€å·®ããç®ã«èŠããã¢ãŒãã£ãã¡ã¯ããçæãããããã«çºçããŸãã ãã®åé¡ã®è§£æ±ºçã¯ã©ãã«ãç°¡åã§ã¯ãªãããã®å¹³é¢ãŸã§ã®è·é¢ãå¢ããã ãã§ãã
mCamera -> setFarClipDistance( 1000000 );
第äºã«ããŸã£ããèŠããªãã¯ãã®æ°Žã®äžã«ããªããªã£ãã倪éœã®äžã®éšåã«ã¯ãå°è±¡çãªçœãçžããããŸãã ãã®åé¡ã®æ ¹æ¬ã¯æ¯èгã®åé¡ãšåãã§ãã倪éœïŒããã³æïŒã¯æ®éã®Ogreãªããžã§ã¯ãã§ã¯ãããŸããã ä¿®æ£ããã«ã¯ããããã®ãªããžã§ã¯ãã®ãããªã¢ã«ã«æ·±åºŠãã¯ããã¯ã远å ããå¿
èŠããããŸãã ããã«æé©ãªå Žæã¯ãmedia / Caelumãã£ã¬ã¯ããªã®Sun.materialããã³moon.materialãã¡ã€ã«ã§ãã ãããã®ãã¡ã€ã«ã«èšè¿°ãããŠããåè³æã«æ¬¡ã®æ®µèœã远å ããå¿
èŠããããŸãã
technique HydraxDepth
{
scheme HydraxDepth
pass
{
lighting off
texture_unit
{
colour_op_ex modulate src_manual src_current 0 0 0
}
}
}
å¿
èŠãªãã¹ãŠã®ä¿®æ£ãå«ãmedia_fixed.zipã¢ãŒã«ã€ãã¯ã
ããããããŠã³ããŒãã§ã
ãŸã ã ãããã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšããã¹ãŠãé©åã«é
眮ãããŸãã

ã¹ããã5ïŒæ€ç
æåŸã®ä»äžãã¯ãå±
å¿å°ã®è¯ã颚æ¯ã«æ€ç©ã远å ããããšã§ãã Ogre Paged Geometry Engineã©ã€ãã©ãªã¯ãããã«æé©ã§ãããªããªãã倧éã®å°ããªã¡ãã·ã¥ãé·ãè·é¢ã§ã¬ã³ããªã³ã°ã§ããããã§ããããã¯ãããšãã°ãæšãèã¿ãèãç³ãªã©ã®ããæ£®æã·ãŒã³ã®æ§ç¯ã«ç¹ã«åœ¹ç«ã¡ãŸãã ãã®ã©ã€ãã©ãªã¯ãç¡æã©ã€ã»ã³ã¹ã®äžã§æããªãã©ã«ãªãã®ã®1ã€-MITïŒããã³OgreèªäœïŒã®äžã§é
åžãããŸãã
Paged Geometryã®ææ°ããŒãžã§ã³ã¯
ãã®ã¢ãã¬ã¹ã«ããŠã³ããŒãã§ã
ãŸã ãããã§ããå¿
èŠãªãã¹ãŠã®ãã¡ã€ã«ããã¹ããããžã§ã¯ãã®ãœãŒã¹ããªãŒã«ã³ããŒããŸããã ã©ã€ãã©ãªã¯CMakeããµããŒãããŠãããããCMakeLists.txtã«è¿œå ããå¿
èŠãããã®ã¯ãããããŒãã¡ã€ã«ã®å Žæãã©ã€ãã©ãªãã¡ã€ã«ã®å Žæãããã³ã©ã€ãã©ãªãœãŒã¹èªäœã®å Žæã®æ°è¡ã®ã¿ã§ãã
include_directories (
# ...
"PagedGeometry/include"
"${CMAKE_BINARY_DIR}/PagedGeometry/include"
# ...
add_subdirectory ( PagedGeometry )
# ...
target_link_libraries ( LandscapeApp ${ OGRE_LIBRARIES } ${ OGRE_Terrain_LIBRARIES } ${ OIS_LIBRARIES }
Caelum Hydrax PagedGeometry )
ããã«ããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã次ã®3ã€ã®ã¿ã€ãã®ãªããžã§ã¯ãã®è¿œå ã«å¶éããŠããŸãã
- ããŒã;
- æš;
- ãã®ä»ã®æ€çïŒèã¿ãè±ãããã³ïŒã
ãããè¡ãã«ã¯ãã¡ã€ã³ã¯ã©ã¹ã«ããŒã¯ã©ã¹
Forests::PagedGeometry
ïŒããã³è£å©
Forests::GrassLoader
ïŒã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãã€ã³ã¿ãŒã远å ããŸããããã«å¿
èŠãªãã¡ã€ã«ãå¿ããªãã§ãã ããã
#include <PagedGeometry.h>
#include <GrassLoader.h>
class LandscapeApplication : public BaseApplication
{
// ...
protected :
// ...
Forests :: PagedGeometry * grass, * trees, * bushes;
Forests :: GrassLoader * grassLoader;
};
次ã«ã
LandscapeApplication
ã³ã³ã¹ãã©ã¯ã¿ãŒã次ã®ããã«å€æŽããŠããããã®ãã€ã³ã¿ãŒããŒãã§åæåããŸãã
LandscapeApplication :: LandscapeApplication( void ) : grass( NULL ), trees( NULL ), bushes( NULL )
{
}
ããã«ãæå®ããã座æšxãšzãæã€ãã€ã³ãã®é¢šæ¯ã®é«ããè¿ã颿°ãå¿
èŠã§ãã ãã®é¢æ°ãåŒã³åºããšãPaged Geometryã¯ãã¹ãŠã®å°éå
·ãå°é¢ã«æ£ããé
眮ããŸãã ã¯ã©ã¹ã¡ãœããã§ã¯ãªããå¿
èŠãªé¢æ°ã«ãªããŸãã
this
æé»çã«ã¯ã©ã¹ã¡ãœããã«æž¡ããããã€ã³ã¿ã§ãããã©ã€ãã©ãªã¯åã«ããããååŸããå ŽæããããŸããã ãããã£ãŠãã°ããŒãã«å€æ°ãå¿
èŠã§ããããã¯ãã©ã³ãã¹ã±ãŒãèªäœãšæ©èœéã®æ¥ç¶ã®ããã«ãã©ã³ãã¹ã±ãŒãããŒãžã®ã°ã«ãŒãã管çããã¯ã©ã¹ãžã®ãã€ã³ã¿ã§ãã ãŸããç§ãã¡ã®èšç»ãå®çŸããŸãã
static TerrainGroup * terrainGroup = NULL ;
static float getTerrainHeight( float x, float z, void * userData)
{
OgreAssert(terrainGroup, "Terrain isn't initialized" );
return terrainGroup -> getHeightAtWorldPosition(x, 0 , z);
}
ãã®å€æ°ã¯æåã¯
NULL
ã§ããããã
TerrainGroup
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãã€ã³ã¿ãŒã§åæåããå¿
èŠããããŸã
TerrainGroup
ã¡ãœããã®ã©ã³ãã¹ã±ãŒãåæåã³ãŒãã®åŸã«ââæ¬¡ã®è¡ãäœæã
createScene
ã
terrainGroup = mTerrainGroup;
æåŸã«ã
createScene
ã¡ãœããã§å¿
èŠãªãã¹ãŠã®ãªããžã§ã¯ãã®åæåã³ãŒãã远å ã§ããŸãã
ã³ãŒã//
grass = new PagedGeometry(mCamera);
grass -> addDetailLevel < GrassPage > ( 160 ); // : 60
grassLoader = new GrassLoader(grass);
grass -> setPageLoader(grassLoader);
grassLoader -> setHeightFunction(getTerrainHeight); // ,
GrassLayer * l = grassLoader -> addLayer( "3D-Diggers/plant1sprite" ); //
l -> setMinimumSize( 0.9f , 0.9f ); // ...
l -> setMaximumSize( 2 , 2 ); // ...
l -> setAnimationEnabled( true ); //
l -> setSwayDistribution( 7.0f ); //
l -> setSwayLength( 0.1f ); // - 0.1
l -> setSwaySpeed( 0.4f ); //
l -> setDensity( 3.0f ); //
l -> setRenderTechnique(GRASSTECH_SPRITE); //
l -> setFadeTechnique(FADETECH_GROW); //
l -> setColorMap( "terrain_texture2.jpg" ); //
l -> setDensityMap( "densitymap.png" ); //
l -> setMapBounds(TBounds( 0 , 0 , 3000 , 3000 )); //
//
trees = new PagedGeometry(mCamera);
trees -> addDetailLevel < WindBatchPage > ( 150 , 30 ); // 150 180
trees -> addDetailLevel < ImpostorPage > ( 900 , 50 ); // 900 950
TreeLoader2D * treeLoader = new TreeLoader2D(trees, TBounds( 0 , 0 , 5000 , 5000 ));
trees -> setPageLoader(treeLoader);
treeLoader -> setHeightFunction(getTerrainHeight); // ,
treeLoader -> setColorMap( "terrain_lightmap.jpg" ); //
Entity * tree1 = mSceneMgr -> createEntity( "Tree1" , "fir05_30.mesh" ); //
Entity * tree2 = mSceneMgr -> createEntity( "Tree2" , "fir14_25.mesh" );
trees -> setCustomParam(tree1 -> getName(), "windFactorX" , 15 ); //
trees -> setCustomParam(tree1 -> getName(), "windFactorY" , 0.01f );
trees -> setCustomParam(tree2 -> getName(), "windFactorX" , 22 );
trees -> setCustomParam(tree2 -> getName(), "windFactorY" , 0.013f );
// 5000
Vector3 position = Vector3 :: ZERO;
Radian yaw;
Real scale;
for ( int i = 0 ; i < 5000 ; i ++ )
{
yaw = Degree(Math :: RangeRandom( 0 , 360 ));
position.x = Math :: RangeRandom( 0 , 2000 ); // Y , ..
position.z = Math :: RangeRandom( 2300 , 4000 ); // - getTerrainHeight,
scale = Math :: RangeRandom( 0.07f , 0.12f );
if (Math :: UnitRandom() < 0.5f )
{
if (Math :: UnitRandom() < 0.5f )
treeLoader -> addTree(tree1, position, yaw, scale);
}
else
treeLoader -> addTree(tree2, position, yaw, scale);
}
// /
bushes = new PagedGeometry(mCamera);
bushes -> addDetailLevel < WindBatchPage > ( 80 , 50 );
TreeLoader2D * bushLoader = new TreeLoader2D(bushes, TBounds( 0 , 0 , 5000 , 5000 ));
bushes -> setPageLoader(bushLoader);
bushLoader -> setHeightFunction(getTerrainHeight);
bushLoader -> setColorMap( "terrain_lightmap.jpg" );
Entity * fern = mSceneMgr -> createEntity( "Fern" , "farn1.mesh" ); //
Entity * plant = mSceneMgr -> createEntity( "Plant" , "plant2.mesh" ); //
Entity * mushroom = mSceneMgr -> createEntity( "Mushroom" , "shroom1_1.mesh" ); //
bushes -> setCustomParam(fern -> getName(), "factorX" , 1 ); //
bushes -> setCustomParam(fern -> getName(), "factorY" , 0.01f );
bushes -> setCustomParam(plant -> getName(), "factorX" , 0.6f );
bushes -> setCustomParam(plant -> getName(), "factorY" , 0.02f );
// 20000
for ( int i = 0 ; i < 20000 ; i ++ )
{
yaw = Degree(Math :: RangeRandom( 0 , 360 ));
position.x = Math :: RangeRandom( 0 , 2000 );
position.z = Math :: RangeRandom( 2300 , 4000 );
if (Math :: UnitRandom() < 0.8f ) {
scale = Math :: RangeRandom( 0.3f , 0.4f );
bushLoader -> addTree(fern, position, yaw, scale);
} else if (Math :: UnitRandom() < 0.9 ) {
scale = Math :: RangeRandom( 0.2f , 0.6f );
bushLoader -> addTree(mushroom, position, yaw, scale);
} else {
scale = Math :: RangeRandom( 0.3f , 0.5f );
bushLoader -> addTree(plant, position, yaw, scale);
}
}
...ãããŠã
LandscapeApplication
ãã¹ãã©ã¯ã¿ãžã®ãã¡ã€ãã©ã€ãºã³ãŒãïŒ
ãã¡ã€ãã©ã€ãºã³ãŒãLandscapeApplication ::~ LandscapeApplication( void )
{
if (grass)
{
delete grass -> getPageLoader();
delete grass;
grass = NULL ;
}
if (trees)
{
delete trees -> getPageLoader();
delete trees;
trees = NULL ;
}
if (bushes)
{
delete bushes -> getPageLoader();
delete bushes;
bushes = NULL ;
}
mSceneMgr -> destroyEntity( "Tree1" );
mSceneMgr -> destroyEntity( "Tree2" );
mSceneMgr -> destroyEntity( "Fern" );
mSceneMgr -> destroyEntity( "Plant" );
mSceneMgr -> destroyEntity( "Mushroom" );
}
ïŒãã®ã³ãŒãããªããšãã¢ããªã±ãŒã·ã§ã³ã¯çµäºæã«ãšã©ãŒã§ã¯ã©ãã·ã¥ããŸãïŒã
ããŠããããŠæãéèŠãªããš
Forests::PagedGeometry
ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãåãã¬ãŒã ã
update()
ã¡ãœãããåŒã³åºããŠããã©ã¬ã¹ããä»®æ³é¢šã®çªé¢šã®äžã§ã¹ã ãŒãºã«æºããããã«
update()
å¿
èŠããããŸãã
bool LandscapeApplication :: frameEnded( const Ogre :: FrameEvent & evt)
{
// ...
grass -> update();
trees -> update();
bushes -> update();
return true ;
}
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããããšã«ãããç§æçãªæ£®ææ¯èгã芳å¯ã§ããŸãã


...幞ããªããšã«ãããã«ã¯èœãšã穎ã¯ãããŸããã æ³šç®ã«å€ããå¯äžã®ããšã¯ããã©ãŒãã³ã¹ã®äœäžã§ãïŒããã©ãŒãã³ã¹ãæ¹åããããã®å€ãã®ãã¯ããã¯ã«ããããããïŒéåžžã®
LODããå§ãŸããã©ã³ãã¹ã±ãŒããµãã·ã¹ãã ãšåæ§ã®ããŒãžåå²ã¡ã«ããºã ã§çµãããå®éã®ããªãŒãé·è·é¢ã®ã¹ãã©ã€ãã«çœ®ãæããïŒãPaged Geometry衚瀺ãããæ€çã€ã³ã¹ã¿ã³ã¹ã®æ°ãšç»è³ªãæ
éã«èª¿æŽããå¿
èŠããããŸãã ããã§ããPaged GeometryããµããŒãããOgitorãšãã£ã¿ãŒã䜿çšããããšããå§ãããŸããããã«ãããæ€çãé©åãªå ŽæïŒãã€ã³ãã§ãã©ã·ãããããããªãã®ïŒã«ç°¡åã«ã¹ã±ããããå¿
èŠãªãã©ã¡ãŒã¿ãŒããã¹ãŠèª¿æŽã§ããŸãã
å®å
šã«ã³ã³ãã€ã«ãããããã«å®è¡ã§ãããã¹ããããžã§ã¯ãã¯ã
ããããããŠã³ããŒãã§ã
ãŸã ã
ãã®å Žæãèªãã§ããããã¹ãŠã®äººã«æè¬ããŸã-ããã«çŽ æµãªã¹ã¯ãªãŒã³ã·ã§ããïŒ


ãããŠããããªïŒç§ãäœã£ãã®ã§ã¯ãªããåé¡ã®ã©ã€ãã©ãª-OgreãHydraxãCaelumã䜿çšããŠäœæãããŸããïŒïŒ
ãŸããèšäºã®æºåã«åœ¹ç«ã€habrayuzer Sergey
ViruScD ãOgreãšã³ãžã³ããã³åªããæ§æåŒ·èª¿è¡šç€ºã®ããã«
dumpz.orgã®äœæè
ã«
ååããAndrey engine9ã«æè¬ããŸãã
UPD ïŒã¢ã³ããšã€ãªã¢ã¹ã
æå¹ãªç¶æ
ã§ã¹ã¯ãªãŒã³ã·ã§ããã
åååŸããŸãããã³ã¡ã³ããããããšã
m1el ã