200 likes | 338 Views
Po čítačové hry a animace. Cvi čení 2. Osnova. Vstup od u živatele Myš Klávesnice Joystick Content pipeline Assety Content processory 3D Modely Import /Export Zobrazen í Transformace. Input – Klávesnice a Joystick. Namespace Microsoft.Xna.Framework.Input Stav
E N D
Počítačové hry a animace Cvičení 2
Osnova • Vstup od uživatele • Myš • Klávesnice • Joystick • Content pipeline • Assety • Content processory • 3D Modely • Import/Export • Zobrazení • Transformace
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
Input – Myš • Game.IsMouseVisible = true • Pozice a tlačítka • Mouse.GetState() • X, Y • LeftButton, RightButton, …
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
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
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
Content Pipeline II • Importéry pro 3D modely • Autodesk .FBX • DirectX .X • Export FBX • Maya – Nutno zapnout v pluginech • Max – Přímo • Export X • http://www.kwxport.org/ pro Max
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 Importersample na creators.xna.com
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<Model> • Uložit transformace pro jednotlivé meshe • Matrix[] transforms = new Matrix[Model.Bones.Count]; • Model.CopyAbsoluteBoneTransformsTo(transforms);
Transformace • Homogenní koordináty • Rn => n + 1 • Affiní transformace reprezentovány jako maticové operace • Rotation • Scale (Shear) • Translation
Rotace • Rotace • Matice • Matrix.CreateRotationX • Matrix.CreateRotationY • Matrix.CreateRotationZ
Scale • Scale • Škálování daným faktorem • Matrix.CreateScale • Shear • Zkosení daným faktorem
Translace • Není lineární transformací • A => A + t • Matrix.CreateTranslation
Quaterniony • CreateFromRotationMatrix • CreateFromYawPitchRoll • CreateFromAxisAngle • Interpolace - Slerp, Lerp • Matrix.CreateFromQuaternion!
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(); • }
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);
Code 5 • Load • Content.Load<Model> • 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