Useful Tools for Making Video Games Part I An overview of Ogre
Sample Games Thunder Wheels Thunder Wheels Kong Kong Masterplan Masterplan Pacific Storm Pacific Storm Trampoline Trampoline
Features Graphics API independent 3D implementation Platform independence Material & Shader support Well known texture formats: png, jpeg, tga, bmp, dds, dxt Mesh support: Milkshape3D, 3D Studio Max, Maya, Blender Scene features BSP, Octree plugins, hierarchical scene graph Special effects Particle systems, skyboxes, billboarding, HUD, cube mapping, bump mapping, post-processing effects Easy integration with physics libraries ODE, Tokamak, Newton, OPCODE Open source!
Core Objects
Startup Sequence ExampleApplication Go() Setup() Configure() setupResources() chooseSceneManager() createCamera() createViewport() createResourceListener() loadResources() createScene() frameStarted/Ended() createFrameListener() destroyScene()
Basic Scene Entity, SceneNode Camera, lights, shadows BSP map Integrated ODE physics BSP map Frame listeners
Terrain, sky, fog
CEGUI Window, panel, scrollbar, listbox, button, static text Media/gui/ogregui.layout CEGUI::Window* sheet = CEGUI::WindowManager::getSingleton().load WindowLayout( (CEGUI::utf8*)"ogregui.layout"); mGUISystem->setGUISheet(sheet);
Animation Node animation (camera, light sources) Skeletal Animation AnimationState *mAnimationState; mAnimationState = ent- >getAnimationState("Idle"); mAnimationState->setLoop(true); mAnimationState->setEnabled(true); mAnimationState- >addTime(evt.timeSinceLastFrame); mNode->rotate(quat);
Animation Crowd (instancing vs single entity) InstancedGeometry* batch = new InstancedGeometry(mCamera- >getSceneManager(), "robots" ); batch->addEntity(ent, Vector3::ZERO); batch->build(); Facial animation VertexPoseKeyFrame* manualKeyFrame; manualKeyFrame->addPoseReference(); manualKeyFrame->updatePoseReference ( ushort poseIndex, Real influence) ushortReal
Picking
CEGUI::Point mousePos = CEGUI::MouseCursor::getSingleton().getPosition(); Ray mouseRay = mCamera->getCameraToViewportRay(mousePos.d_x/float(arg.state.width), mousePos.d_y/float(arg.state.height)); mRaySceneQuery->setRay(mouseRay); mRaySceneQuery->setSortByDistance(false); RaySceneQueryResult &result = mRaySceneQuery->execute(); RaySceneQueryResult::iterator mouseRayItr; Vector3 nodePos; for (mouseRayItr = result.begin(); mouseRayItr != result.end(); mouseRayItr++) { if (mouseRayItr->worldFragment) { nodePos = mouseRayItr->worldFragment->singleIntersection; break; } // if }
Particle Effects mSceneMgr->getRootSceneNode()- >createChildSceneNode()- >attachObject( mSceneMgr- >createParticleSystem("sil", "Examples/sil")); Examples/sil { material Examples/Flare2 particle_width 75 particle_height 100 cull_each false quota 1000 billboard_type oriented_self // Area emitter emitter Point { angle 30 emission_rate 75 time_to_live 2 direction velocity_min 250 velocity_max 300 colour_range_start colour_range_end } // Gravity affector LinearForce { force_vector force_application add } // Fader affector ColourFader { red -0.5 green -0.5 blue -0.5 }
Particle Effects Particle system attributes quota material particle_width particle_height cull_each billboard_type billboard_origin billboard_rotation_type common_direction common_up_vector renderer sorted local_space point_rendering accurate_facing iteration_interval nonvisible_update_timeout Emitter attributes (point, box, clyinder, ellipsoid, hollow ellipsoid, ring) angle colour colour_range_start colour_range_end direction emission_rate position velocity velocity_min velocity_max time_to_live time_to_live_min time_to_live_max duration duration_min duration_max repeat_delay repeat_delay_min repeat_delay_max Affectors (LinearForce, ColorFader) Linear Force Affector ColourFader Affector ColourFader2 Affector Scaler Affector Rotator Affector ColourInterpolator Affector ColourImage Affector DeflectorPlane Affector DirectionRandomiser Affector
Fire and Smoke affector Rotator { rotation_range_start 0 rotation_range_end 360 rotation_speed_range_start - 60 rotation_speed_range_end 200 }
Cel Shading vertex_program Ogre/CelShadingVP cg { source Example_CelShading.cg entry_point main_vp … default_params { … } material Examples/CelShading { … vertex_program_ref Ogre/CelShadingVP {} fragment_program_ref Ogre/CelShadingFP {} }
Cube Mapping With Perlin noise to distort vertices void morningcubemap_fp ( float3 uv : TEXCOORD0, out float4 colour : COLOR, uniform samplerCUBE tex : register(s0) ) { colour = texCUBE(tex, uv); // blow out the light a bit colour *= 1.7; }
Bump Mapping + =
Reflections & Refractions // Noise texture_unit { // Perlin noise volume texture waves2.dds // min / mag filtering, no mip filtering linear linear none } // Reflection texture_unit { // Will be filled in at runtime texture Reflection tex_address_mode clamp // needed by ps.1.4 tex_coord_set 1 } // Refraction texture_unit { // Will be filled in at runtime texture Refraction tex_address_mode clamp // needed by ps.1.4 tex_coord_set 2 }
Reflections & Refractions
Grass Each grass section is 3 planes at 60 degrees to each other Normals point straight up to simulate correct lighting
Post-Processing Effects
Supporting tools (add-ons) Blender, Autodesk 3DS, Milkshape3D, Softimage XSI importers/exporters Particle editors, mesh viewers GUI editors Physics bindings Scene exporters and lots more Add-on site
References