Počítačové hry a animace Cvičení 2
(2) Osnova Vstup od uživatele – –Myš – –Klávesnice – –Joystick Content pipeline – –Assety – –Content processory 3D Modely – –Import/Export – –Zobrazení – –Transformace
(3) Input – Klávesnice a Joystick Namespace – –Microsoft.Xna.Framework.Input Stav – –Keyboard.GetState( PlayerIndex ) – –GamePad.GetState( PlayerIndex ) Držet si předchozí a aktuální stav – –Ukládat do KeyboardState a GamePadState – –Konstanty pro tlačítka v Keys a Buttons Stavy – –New press – –Pressed – –New release – –Released Code 1: Klávesnice – –Pohyb spritem pomocí šipek na klávesnici ve ctyřech směrech – –Pomocí stavu „New press“ přidaného do IsKeyState měnit text ON na OFF a zpět při stisknutí Enter
(4) Input – Myš Game.IsMouseVisible = true Pozice a tlačítka – –Mouse.GetState() X, Y LeftButton, RightButton, …
(5) Input - Kurzor Kurzor bude DrawableGameComponent – –Update načte stav myši (Mouse.GetState) – –Draw vykreslí kurzor na pozici SpriteBatch CustomCursor.cs Zaregistrovat v konstruktoru Game – –Components.Add(new Class(this)); Code 2: Přidat custom kurzor
(6) Input – Joystick Mouse Emulace myši přes thumb stick GamePad.GetState(padIndex) gamePadState.ThumbSticks.Left.X gamePadState.ThumbSticks.Left.Y Na rozdíl od myši jen přidáváme Zpomalení/zrychlení na triggeru
(7) Content Pipeline Kompilace do assetu pomocí – –Content importerů Konverze do XNA nativních DOM pro content processor – –Content procesorů Zkompiluje do managed code objectu k přímému použití v XNA
(8) Content Pipeline II Importéry pro 3D modely – –Autodesk.FBX – –DirectX.X Export FBX – –Maya – Nutno zapnout v pluginech – –Max – Přímo Export X – – pro Maxhttp://
(9) Custom Content Importer Můžeme si napsat vlastní – –Namespace Microsoft.Xna.Framework.Content.Pipeline Content Pipeline Extension Library Přetížit fci Import MeshBuilder – –Pomocná třída pro načtení a uložení jednoho meshe Code …. No, to by bylo do rána.. Takže např. Custom Model Importer sample na creators.xna.com
(10) Načtení 3D modelů Načtení – –Přidat.FBX nebo.X do Contentu – –Nečtvercové textury jsou problém V nastavení content processoru nastavit „Resize Textures to Power of Two“ – –Načíst pomocí Content.Load – –Uložit transformace pro jednotlivé meshe Matrix[] transforms = new Matrix[Model.Bones.Count]; Model.CopyAbsoluteBoneTransformsTo(transforms);
(11) Transformace Homogenní koordináty – –R n => n + 1 Affiní transformace reprezentovány jako maticové operace – –Rotation – –Scale (Shear) – –Translation
(12) Rotace – –Matice Matrix.CreateRotationX Matrix.CreateRotationY Matrix.CreateRotationZ
(13) Scale – –Škálování daným faktorem – –Matrix.CreateScale Shear – –Zkosení daným faktorem
(14) Translace Není lineární transformací – –A => A + t Matrix.CreateTranslation
(15) Quaterniony CreateFromRotationMatrix CreateFromYawPitchRoll CreateFromAxisAngle Interpolace - Slerp, Lerp Matrix.CreateFromQuaternion!
(16) Zobrazení 3D modelu Pro každý mesh – –Pro každý effect/shader Nastavíme parametry – –Vykreslíme – –Matrix[] transforms = new Matrix[Model.Bones.Count]; – –Model.CopyAbsoluteBoneTransformsTo(transforms); – –foreach (ModelMesh mesh in model.Meshes) – –{ foreach(BasicEffect effect in mesh.Effects) { effect.EnableDefaultLighting(); effect.World = transforms[mesh.ParentBone.Index] * world; effect.View = view; effect.Projection = projection; } – – – –mesh.Draw(); – –}
(17) Fixed function pipeline
(18) Progammable Pipeline
(19) Nastavení matic View – –Matrix.CreateLookAt(odkud, kam, up vektor) World – –Matrix.Identity – –Matrix.CreateScale( scale ); Projection – –Viewport viewport = graphics.GraphicsDevice.Viewport; – –float aspectRatio = (float)viewport.Width / (float)viewport.Height; – –Matrix.CreatePerspectiveFieldOfView(úhel, poměr, near plane, far plane);
(20) Code 5 Load – –Content.Load – –Matrix[] transforms = new Matrix[Model.Bones.Count]; – –Model.CopyAbsoluteBoneTransformsTo(transforms); Nastavení matic – –Matrix.CreateLookAt(okud, kam, up vektor) – –Matrix.Identity – –Matrix.CreatePerspectiveFieldOfView(úhel, poměr, near plane, far plane); Vykreslení – –foreach (ModelMesh mesh in model.Meshes) – –foreach(BasicEffect effect in mesh.Effects) – –effect.World = transforms[mesh.ParentBone.Index] * world; Code 3: Načtěte a vykreslete 3D model