Download presentation
Presentation is loading. Please wait.
Published byBartholomew Barnett Modified over 9 years ago
1
SE Team 9 3D Flyer Cole Hoosier Ryan Hannebaum Leanne Gray Alex Stampbach Matt Cook
2
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.
3
Presentation Outline I.Introduction II.Review of web page III.Project Accomplishments IV.Design (UML Diagrams) V.Source Code A.Lighting B.Sky, Fog, and Terrain C.Physics D.Mouse Controller VI.User Manual VII.Testing VIII.Project Demonstration IX.Conclusion
4
GlobalFlyer Web Site http://seteam9.cis.ksu.edu/
5
Project Accomplishments
6
Time and Lines of Code Minutes LOC* *In final project Cole4,340160 Matt2,160190 Alex2,5500 Ryan1,9209 Leanne2,20545 Total13,175404
7
Effort Over the Semester Time in minutes =Presentation during this time period
8
Task Effort vs. Estimated Time
9
Design
10
FrameStarted Sequence Diag
18
Source Code Explained
19
Lighting & Shadows
21
Sky, Fog and Terrain
22
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 );
23
Fog setFog(FogMode mode, const ColourValue& colour, Real expDensity,Real linearStart, Real linearEnd) mSceneMgr->setFog( FOG_LINEAR, fadeColour, 0, 0, 7500 );
24
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
25
Physics Engine
26
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
27
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
28
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
29
Get’s and Set’s void getVelocity( Vector3 *result ); void setVelocity (const Vector3 *vel); void getPosition (Vector3 *result ); void setPosition (const Vector3 *pos);
30
Example: One Force Two Forces Drag
31
Text: ResourceGroupManager –Holds Location of Font FontManager –Manages the Font –Creates a resource pointer “font” Font –Sets size, resolution, etc of font
32
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
33
So…. Panel TextArea (font) OverlayManager
34
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
35
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)
36
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
37
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
38
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
39
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
40
Mouse Listener
41
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/
42
Mouse Control Incorporation of MouseListener and MouseMotionListener Two classes changed: –class SampleListener –class SampleApplication
43
Class SampleListener SampleListener extends: –public ExampleFrameListener, –public MouseListener // Extension added –public MouseMotionListener // Extension added class SampleListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
44
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
45
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 );
46
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
47
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
48
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
49
Class SampleApplication Protected –CEGUI::OgreCEGUIRenderer *mGUIRenderer; –CEGUI::System *mGUISystem; ~SampleApplication() –delete mGUISystem; –delete mGUIRenderer;
50
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
51
Analysis Estimated time for mouse implementation: 11 hours Actual time spent for mouse implementation: 12 hours
52
Explanation The task was more complex than initially determined –Ran into unseen linker errors Remedy –Needed to allocate more time to the task –Or needed another person working on the task
53
User Manual Gameplay Support references Software requirements
54
Testing of the GlobalFlyer C1 (and C0) coverage
55
Testing Method Debugging output at the start of every block and other key places “If” blocks without a corresponding “else” block had one added During the course of testing, every decision was covered at least once For the final run, unlikely cases that required code modification were skipped
56
Covering the Cases Use all movement keys: –q, w, e, a, s, d, Use all camera-selection keys: –F1, F2, F3 Crash the plane and restart with F1 Fly to/through the edge of the world Toggle SHOW_STATS in testing.h
57
Exceptions to Coverage All FMOD-related code was skipped –Rationale: This was inherited code that never functioned properly this semester. –Plan: Correct the problems next semester and commence testing at that point
58
Exceptions to Coverage ExtendedCamera::ExtendedCamera –Remove camera argument in constructor at sample_application.cpp:73 if (camera == 0) { debug("ExtendedCamera::ExtendedCamera 2 (if)"); mCamera = mSceneMgr->createCamera (mName); mOwnCamera = true; }
59
Exceptions to Coverage SampleListener::update –showstats section: 3e Enable SHOW_STATS, and change bool to “false” for setTextArea sample_application.cpp:119 –mchar and mExCamera sections: 2e, 7e, 11e, 12e, 13e, 15e, 16e, 17e, 20e, 21e, 22e Remove calls to setCharacter and/or setExtendedCamera at sample_application.cpp:79-80
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.