590 likes | 594 Views
SE Team 9 3D Flyer. Cole Hoosier Ryan Hannebaum Leanne Gray Alex Stampbach Matt Cook. Project Statement. GlobalFlyer allows a player to fly a Wright brothers-style airplane in 3D space using the OGRE graphic rendering engine and the FMOD sound system. Presentation Outline. Introduction
E N D
SE Team 93D Flyer Cole HoosierRyan HannebaumLeanne GrayAlex StampbachMatt Cook
Project Statement • GlobalFlyer allows a player to fly a Wright brothers-style airplane in 3D space using the OGRE graphic rendering engine and the FMOD sound system.
Presentation Outline • Introduction • Review of web page • Project Accomplishments • Design (UML Diagrams) • Source Code • Lighting • Sky, Fog, and Terrain • Physics • Mouse Controller • User Manual • Testing • Project Demonstration • Conclusion
GlobalFlyer Web Site • http://seteam9.cis.ksu.edu/
Effort Over the Semester Time in minutes =Presentation during this time period
Sky • setSkyPlane(bool enable, const Plane& plane, const String& materialName, Real scale, Real tiling , bool drawFirst , Real bow, int xsegments , int ysegments); • mSceneMgr->setSkyPlane( true, plane, "Examples/CloudySky", 500, 20, true, 0.5, 150, 150 );
Fog • setFog(FogMode mode, const ColourValue& colour, Real expDensity,Real linearStart, Real linearEnd) • mSceneMgr->setFog( FOG_LINEAR, fadeColour, 0, 0, 7500 );
Terrain • # Heightmap-source specific settings • Heightmap.image=../new_media/terrain_s.png • # If you use RAW, fill in the below too • # RAW-specific setting - size (horizontal/vertical) • #Heightmap.raw.size=257 • # RAW-specific setting - bytes per pixel (1 = 8bit, 2=16bit) • #Heightmap.raw.bpp=2 • # How large is a page of tiles (in vertices)? Must be (2^n)+1 • PageSize=257 • # How large is each tile? Must be (2^n)+1 and be smaller than PageSize • TileSize=17 • # The maximum error allowed when determining which LOD to use • MaxPixelError=3 • # The size of a terrain page, in world units • PageWorldX=15000 • PageWorldZ=15000 • # Maximum height of the terrain • MaxHeight=250 terrain_s.png
Physics • PhysicsEngine(); • 9 Functions: • void translateFromWorld( const Quaternion &quat, Vector3 *vec); • void translateToWorld( const Quaternion &quat, Vector3 *vec); • void applyForce( const Vector3 *dir, float time); • void applyDrag (const Quaternion &quat, const Vector3 *surface_areas, float coeff, float time); • void update(float time); • void getVelocity( Vector3 *result ); • void setVelocity (const Vector3 *vel); • void getPosition (Vector3 *result ); • void setPosition (const Vector3 *pos); • 3 Values: Position, Velocity, and DragP
Translations: • void translateFromWorld( const Quaternion &quat, Vector3 *vec); • void translateToWorld( const Quaternion &quat, Vector3 *vec); Multiplying a Vector3 by a Quaternion translates the Vector into the Quaternion’s orientation. This is accomplished at the Vector’s location in space (away from the Origin) using complex math
Apply Forces: • void applyForce( const Vector3 *dir, float time); • void applyDrag (const Quaternion &quat, const Vector3 *surface_areas, float coeff, float time); For our plane: time = time since last call to update surface area = 5, 20, 1 coeff = 617.0
Get’s and Set’s • void getVelocity( Vector3 *result ); • void setVelocity (const Vector3 *vel); • void getPosition (Vector3 *result ); • void setPosition (const Vector3 *pos);
Example: • One Force • Two Forces • Drag
Text: • ResourceGroupManager • Holds Location of Font • FontManager • Manages the Font • Creates a resource pointer “font” • Font • Sets size, resolution, etc of font
Creating the Text Area • OverlayManager • Contains OverlayContainer • OverlayContainer “panel” • Has a size and a location • Contains a TextAreaOverlayElement • TextAreaOverlayElement “textArea” • Has a size, location, font, and color
So…. Panel OverlayManager TextArea (font)
Execution • TextArea, and others, are created, and textArea is passed to sampleListener • Every 10 frames, sampleListener updates the text area Calls • OgreCharacter::GetPosit(Vector3 *pos) • OgreCharacter::GetVeloc(Vector3 *pos) • OgreCharacter::GetRelVeloc(Vector3 *pos) • OgreCharacter::GetDrag(Vector3 *pos) • Displays Values
Physics Implementation in OgreCharacter • Handled in the Update function: • OgreCharacter::update (Real elapsedTime, InputReader *input) • 4 forces • Propeler, Drag, Lift, Gravity • 3 Directions of Turning • Pitch, Roll, Yaw (new)
OgreCharacter keeps track of: • Quaternion: world’s orientation • Vectors • Position, Lift, Speed, Drag, Prop • Constants • gravV = Vector3(0.0, -9.8, 0.0); • surface_areas = Vector3( 5, 20, 1); • LIFT_CONSTANT 206.0f • DRAG_CONSTANT 617.0f
Applying Forces • While not Crashed • Apply Gravity • Relative to world • Apply Lift • In Plane’s y direction, relative to speed squared • Apply Drag • Relative to velocity squared, and position • Apply Propeller • In Plane’s z direction • 3.5 to 5
Turning • Pitch • Turns up/down at 10 degree’s a frame • Roll • Rotates Left/Right at 30 degree’s a frame • Yaw • Turns Left/Right at 10 degree’s a frame
Constants • Developed from Drag, Lift equations: • Lift = Coeff. * ρ *V^2 *1/2 * Area • Drag = -1/2 * ρ * v^2 * A * Coeff. • Adjusted for Idle/Top Speeds • Lose lift at ~ 43.5 • Fine Tuned Through Testing: • Lift = 206 • Drag = 617 • Surface Area = 5,20,1
MouseListener and MouseMotionListener Our sample listener needs to extend these classes in order to receive mouse events. More information on these classes can be found at: http://www.ogre3d.org/docs/api/html/
Mouse Control • Incorporation of MouseListener and MouseMotionListener • Two classes changed: • class SampleListener • class SampleApplication
Class SampleListener • SampleListener extends: • public ExampleFrameListener, • public MouseListener // Extension added • public MouseMotionListener // Extension added class SampleListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
SampleListener protected variables • CEGUI::Renderer *mGUIRenderer; // cegui renderer • bool mRMouseDown; // returns true if the mouse button is down • SceneManager *mSceneMgr; // a pointer to the scene manager
SampleListener constructor • Need to pass SampleListener constructor the scene manager and the renderer objects that we created • SampleListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer) • Need to add the mouse listeners so we can process the events for the mouse • mEventProcessor->addMouseListener( this ); • mEventProcessor->addMouseMotionListener( this );
SampleListener public methods • virtual void mousePressed(MouseEvent* e) • // Right mouse button down • else if (e->getButtonID() & MouseEvent::BUTTON1_MASK) • { • mRMouseDown = true; • } • If the right mouse is pushed we need to set the variable to true
SampleListener public methods • virtual void mouseReleased(MouseEvent* e) • // Right mouse released • else if (e->getButtonID() & MouseEvent::BUTTON1_MASK) • { • mRMouseDown = false; • } • If the right mouse button is released we need to set the variable back to false
SampleListener public methods • virtual void mouseDragged (MouseEvent *e) • mouseMoved(e); • // Update CEGUI with the mouse motion • if ( mRMouseDown ) • { • mCamera->yaw( -e->getRelX() * mRotateSpeed ); • mCamera->pitch( -e->getRelY() * mRotateSpeed ); • } • If the mouse button is down then rotate the camera relative to the current position • getRel() - Finds the distance since last time the method was called
Class SampleApplication • Protected • CEGUI::OgreCEGUIRenderer *mGUIRenderer; • CEGUI::System *mGUISystem; • ~SampleApplication() • delete mGUISystem; • delete mGUIRenderer;
Class SampleApplication • void createScene(void) • mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr); • mGUISystem = new CEGUI::System(mGUIRenderer); // Declaration of the mGUI Renderer and System