center images

This commit is contained in:
sfja 2026-04-22 02:01:19 +02:00
parent 76e03ae95b
commit 6a3f32bee7

View File

@ -15,7 +15,8 @@ Koden ligger i `game/` i repo'et.
For at køre spillet, installer Rust, SDL3 og SDL3_ttf, og kør `cargo run`. For at køre spillet, installer Rust, SDL3 og SDL3_ttf, og kør `cargo run`.
![entity relations diagram](./h5-mst-game-entity-relations.drawio.svg) <img src="./h5-mst-game-entity-relations.drawio.svg" width="50%" height="50%" align="center">
### Vindue, taster-input og 2D-rasterizering ### Vindue, taster-input og 2D-rasterizering
@ -33,7 +34,7 @@ Vi har 2 behov, som SDL3 skal udfylde. Det første er IO-håndtering. Dvs. opret
Funktionalitet til 2D-renderingen er beskrevet som et Rust trait (interface) `trait Renderer` i `src/engine/game.rs`. Dette trait definerer de funktioner, vi skal bruge til at tegne geometri, hovedsageligt `fn draw_triangles`. Dette trait er implementeret for objektet (Rust struct) `struct SdlIo`, defineret i `src/game/sdl_io.rs`. Dette struct indeholder alt SDL-specifik kode. Trait'et er implementeret, så at de positioner og størrelser man passer i `Renderer`'s funktioner er normaliserede i et koordinatsystem. `SdlIo` implementation oversætter disse positioner og størrelser til reelle skærm-værdier. Funktionalitet til 2D-renderingen er beskrevet som et Rust trait (interface) `trait Renderer` i `src/engine/game.rs`. Dette trait definerer de funktioner, vi skal bruge til at tegne geometri, hovedsageligt `fn draw_triangles`. Dette trait er implementeret for objektet (Rust struct) `struct SdlIo`, defineret i `src/game/sdl_io.rs`. Dette struct indeholder alt SDL-specifik kode. Trait'et er implementeret, så at de positioner og størrelser man passer i `Renderer`'s funktioner er normaliserede i et koordinatsystem. `SdlIo` implementation oversætter disse positioner og størrelser til reelle skærm-værdier.
![position translation](./position-translation.png) <img src="./position-translation.png" width="50%" height="50%" align="center">
Funktionalitet til vindue- og event-håndtering er også enkapsuleret i `struct SdlIo`. Interface'et mellem `SdlIo` og spillet er defineret i `trait engine::Game` trait'et. Dette trait definerer funktioner, som defineret af spillet og kaldet af `SdlIo`. Dette består af `fn update`, `fn render` og `fn event` funktionerne. Funktionalitet til vindue- og event-håndtering er også enkapsuleret i `struct SdlIo`. Interface'et mellem `SdlIo` og spillet er defineret i `trait engine::Game` trait'et. Dette trait definerer funktioner, som defineret af spillet og kaldet af `SdlIo`. Dette består af `fn update`, `fn render` og `fn event` funktionerne.
@ -47,8 +48,8 @@ Vi vil gerne lave 3D-rendering til vores spil. Vi har valgt at implementere 3D-r
3D-projektionen er implementeret med *Perspective Projection*[^5] som funktioner på `V3` og `Triangle3` i methods ved navn `project_2d`. Følgende formel er anvendt: 3D-projektionen er implementeret med *Perspective Projection*[^5] som funktioner på `V3` og `Triangle3` i methods ved navn `project_2d`. Følgende formel er anvendt:
<img src="./h5-mst-game-3d-math.jpg" width="49%" height="49%"> <img src="./h5-mst-game-3d-math.jpg" width="50%" height="50%" align="center">
<img src="./h5-mst-game-3d-illustration.jpg" width="49%" height="49%"> <img src="./h5-mst-game-3d-illustration.jpg" width="50%" height="50%" align="center">
Pointen med formelen er at 2D-positionerne bestemmes via forskellen mellem skærmen og punktet på z-aksen i 3D. Dvs. jo længere væk et punkt er, dvs. jo større forskellen er på z-aksen, jo tættere på midten vil punktet ligge i 2D. Dvs. objekter tæt på skærmen vises som større og objekter, der ligger længere væk, vises som mindre. Det er dette, der giver effekten af 3D. Pointen med formelen er at 2D-positionerne bestemmes via forskellen mellem skærmen og punktet på z-aksen i 3D. Dvs. jo længere væk et punkt er, dvs. jo større forskellen er på z-aksen, jo tættere på midten vil punktet ligge i 2D. Dvs. objekter tæt på skærmen vises som større og objekter, der ligger længere væk, vises som mindre. Det er dette, der giver effekten af 3D.
@ -226,8 +227,8 @@ Ved at undersøge projekter på internettet med Arduino eller ESP32 og accelerom
MPU6050'eren er forbundet til ESP32'eren via I2C. Modulet får også strøm fra ESP32-board'et. Pin-konfigurationen er at `VCC` og `GND` på MPU'en er forbundet til `3.3V` og `GND` på ESP32-board'et, og `SCA` og `SCL` er forbundet til henholdvis `A5` og `A4` på boardet. MPU6050'eren er forbundet til ESP32'eren via I2C. Modulet får også strøm fra ESP32-board'et. Pin-konfigurationen er at `VCC` og `GND` på MPU'en er forbundet til `3.3V` og `GND` på ESP32-board'et, og `SCA` og `SCL` er forbundet til henholdvis `A5` og `A4` på boardet.
<img src="./circuit-diagram.png" width="49%" height="49%"> <img src="./circuit-diagram.png" width="50%" height="50%" align="center">
<img src="./h5-mst-breadboard-2.jpg" width="49%" height="49%"> <img src="./h5-mst-breadboard-2.jpg" width="50%" height="50%" align="center">
General information om brug af MPU6050 kan findes i produktspecifikationen (databladet)[^21]. MPU6050 kan køre på, og bliver forsynet med 3.3V. I2C-bussen skal have, og har, en clock rate på 400MHz. Opsætning af MPU'en gøres ved at skrive til I2C registers og læsning af målinger ved læsning af registers. General information om brug af MPU6050 kan findes i produktspecifikationen (databladet)[^21]. MPU6050 kan køre på, og bliver forsynet med 3.3V. I2C-bussen skal have, og har, en clock rate på 400MHz. Opsætning af MPU'en gøres ved at skrive til I2C registers og læsning af målinger ved læsning af registers.