Platform játék
3D-s megjelenítés, véletlenszerű pályagenerálás, jutalmazó játékélmény
Macros | Functions | Variables
camera.c File Reference
#include "camera.h"

Macros

#define focalLength   0.05
 
#define sensorSize   0.07
 
#define renderObjectsPerCube   10
 

Functions

void freeRenderMap ()
 A feldarabolós rajzoláshoz szükséges mátrixot szabadítja fel. More...
 
void followPlayerWithCamera ()
 A játékost követi a kamerával, nem hagyja, hogy a pálya alá lásson. More...
 
void menuCamera (int *getColumns, int *getRows)
 A menüben használt kamerát állítja be, visszaadja a columns-t és rows-t is. More...
 
int getColumns ()
 Visszaadja, hogy hány oszlop látszik a pályából. More...
 
bool cameraDollyZ (int deltaTime, bool restart)
 A kamera dollyzását végzi, a kamerát mozgatja A dolly állását staticban tárolja, ezért új dolly eseteén először egy restart = true-val kell meghívni,. More...
 
intVector2D get2DPoint (vector3D point)
 Térbeli pontból síkbelit képez. A 3D-s pont koordinátái és a kamera alapján kiszámolja, hogy a kamera 2D-s szenzorán hol jelenik meg a pont. Geometriailag leírva, a két ponton (point, cameraPosition) átmenő egyenes egyenletének, és a 'szenzor' vízszintesének metszéspontja a keresett pontunk. A lent és a linken is látható egyenletet először a tér x-z, majd az y-z vetületére alkalmazzuk, és megkapjuk a térbeli pontunk megfelelő síkbeli leképezést. Ez interaktívan ábrázolva így néz ki: https://www.desmos.com/calculator/8qjvkptjmn. More...
 
void drawCuboid (renderObject object, bool sides[])
 Lerajzol egy téglatestet A kamera modul lényege, a rajzolást végzi el az eddigi függvények segítségével. More...
 
void drawMap (int deltaTime)
 Lerajzolja a teljes látható játékteret. A megfelelő rajzoláshoz figyelni kell a testek takarására, nem mindegy ezért, hogy milyen sorrendben rajzoljuk őket. A részecskéknél ezzel nincs probléma, azokat bármilyen sorrendben rajzolhatjuk. Ők a játékteret kitakarják, egymásnál viszont nem látszik, hogy melyik takrja melyiket, ezért azokat elég a játéktér után bármilyen sorrendben lerajzolni. A térképet alkotó kockáknál már nem ilyen egyszeű a helyzet. Azokat 4 irányból kell rajzolni, bal lentről, jobb lentről, bal fentről, illetve jobb fentről középre. Ha ebben a négy lépésben rajzoljuk őket (ezek között a sorrend nem számít) akkor mindig a legfesőket rajzoljuk utoljára, és így valósnak néz ki az eredmény. A játékos, a lövedékek, illetve az ellenségek viszont sajnos nincsenek egy négyzethálóhoz kötve. Így gyakran megesik, hogy az egyik felüket a pálya egyik kockája előtt, a másikat pedig az után, de még a kövektező előtt kéne rajzolni. Ezt nem tudjuk megcsinálni, hatalmas erőforrásba kerülne ez a majdnem pixelről pixelre történő szkennelés. A pályát továbbra is m^3-ént szeretnénk lerajzolni. Hogy ez megfelelően nézzen ki, minden köbméterben csak az abban a kockában lévő dolgokat szeretnénk megrajzolni. Ehhez fel kell "darabolnunk" a játékost, a lövedékeket, illetve az ellenségeket is. A darabolás azt jelenti, hogy egy mátrix minden cellájába beírjuk, hogy az adott kockában melyik, milyen tulajdonsággal rendelkező testek lógnak be. Rajzolásnál pedig a testeknek mindig csak az adott kockabeli részét rajzoljuk le. Mivel a kockákat jó sorrendben rajzoljuk, így a bennük levő "testekrészeket" is jó sorrendbe fogjuk rajzolni. A problémát megoldottuk. More...
 

Variables

vector3D cameraPosition
 
float magnification
 
float columns
 
float rows
 
bool watchBounds = false
 
float leftBound
 
float rightBound
 
float upperBound
 
float lowerBound
 
int leftMostBound
 
int rightMostBound
 
int topBound
 
int bottomBound
 
renderObject *** renderMap = NULL
 

Macro Definition Documentation

◆ focalLength

#define focalLength   0.05

gyújtótáv [m]

◆ renderObjectsPerCube

#define renderObjectsPerCube   10

max( (projectile + player + enemy) / m^3), erről később bővebben.

◆ sensorSize

#define sensorSize   0.07

szenzor hosszabb oldalának a fele [m]

Function Documentation

◆ cameraDollyZ()

bool cameraDollyZ ( int  deltaTime,
bool  restart 
)

A kamera dollyzását végzi, a kamerát mozgatja A dolly állását staticban tárolja, ezért új dolly eseteén először egy restart = true-val kell meghívni,.

Parameters
mseltelt idő
kell-eújrakezdés?
Returns
elérte-e a végállást? Minden frameban újraszámolja a rows&coulmns-t,

◆ drawCuboid()

void drawCuboid ( renderObject  object,
bool  sides[] 
)

Lerajzol egy téglatestet A kamera modul lényege, a rajzolást végzi el az eddigi függvények segítségével.

Parameters
testtéglatest adatai
boolmelyik oldalakat kell rajzolni? Végez egy plusz ellenőrést is, nem csak a paraméterben megadott tömb alapján nem rajzol oldalakat, azokat se rajzolja le, amiket a helyzetük miatt biztosan nem láthat a kamera.

◆ drawMap()

void drawMap ( int  deltaTime)

Lerajzolja a teljes látható játékteret. A megfelelő rajzoláshoz figyelni kell a testek takarására, nem mindegy ezért, hogy milyen sorrendben rajzoljuk őket. A részecskéknél ezzel nincs probléma, azokat bármilyen sorrendben rajzolhatjuk. Ők a játékteret kitakarják, egymásnál viszont nem látszik, hogy melyik takrja melyiket, ezért azokat elég a játéktér után bármilyen sorrendben lerajzolni. A térképet alkotó kockáknál már nem ilyen egyszeű a helyzet. Azokat 4 irányból kell rajzolni, bal lentről, jobb lentről, bal fentről, illetve jobb fentről középre. Ha ebben a négy lépésben rajzoljuk őket (ezek között a sorrend nem számít) akkor mindig a legfesőket rajzoljuk utoljára, és így valósnak néz ki az eredmény. A játékos, a lövedékek, illetve az ellenségek viszont sajnos nincsenek egy négyzethálóhoz kötve. Így gyakran megesik, hogy az egyik felüket a pálya egyik kockája előtt, a másikat pedig az után, de még a kövektező előtt kéne rajzolni. Ezt nem tudjuk megcsinálni, hatalmas erőforrásba kerülne ez a majdnem pixelről pixelre történő szkennelés. A pályát továbbra is m^3-ént szeretnénk lerajzolni. Hogy ez megfelelően nézzen ki, minden köbméterben csak az abban a kockában lévő dolgokat szeretnénk megrajzolni. Ehhez fel kell "darabolnunk" a játékost, a lövedékeket, illetve az ellenségeket is. A darabolás azt jelenti, hogy egy mátrix minden cellájába beírjuk, hogy az adott kockában melyik, milyen tulajdonsággal rendelkező testek lógnak be. Rajzolásnál pedig a testeknek mindig csak az adott kockabeli részét rajzoljuk le. Mivel a kockákat jó sorrendben rajzoljuk, így a bennük levő "testekrészeket" is jó sorrendbe fogjuk rajzolni. A problémát megoldottuk.

Parameters
mseltelt idő Ez a függvény elvégzi a részecskék, a pálya, illetve minden más test rajzolását is. A részecskék mozgatása innen van meghívva.

◆ followPlayerWithCamera()

void followPlayerWithCamera ( )

A játékost követi a kamerával, nem hagyja, hogy a pálya alá lásson.

◆ freeRenderMap()

void freeRenderMap ( )

A feldarabolós rajzoláshoz szükséges mátrixot szabadítja fel.

◆ get2DPoint()

intVector2D get2DPoint ( vector3D  point)

Térbeli pontból síkbelit képez. A 3D-s pont koordinátái és a kamera alapján kiszámolja, hogy a kamera 2D-s szenzorán hol jelenik meg a pont. Geometriailag leírva, a két ponton (point, cameraPosition) átmenő egyenes egyenletének, és a 'szenzor' vízszintesének metszéspontja a keresett pontunk. A lent és a linken is látható egyenletet először a tér x-z, majd az y-z vetületére alkalmazzuk, és megkapjuk a térbeli pontunk megfelelő síkbeli leképezést. Ez interaktívan ábrázolva így néz ki: https://www.desmos.com/calculator/8qjvkptjmn.

Parameters
Térvektortípusú pont
Returns
Síkvektor típusú pont A visszaadott pontnak int koordinátái vannak, hiszen valamelyik pixel koordinátáit jelöli. Ez a függvény igazából egy camera obscura modellje.

◆ getColumns()

int getColumns ( )

Visszaadja, hogy hány oszlop látszik a pályából.

◆ menuCamera()

void menuCamera ( int *  getColumns,
int *  getRows 
)

A menüben használt kamerát állítja be, visszaadja a columns-t és rows-t is.

Variable Documentation

◆ bottomBound

int bottomBound

◆ cameraPosition

vector3D cameraPosition

A kamera térbeli helyvektora.

◆ columns

float columns

◆ leftBound

float leftBound

◆ leftMostBound

int leftMostBound

◆ lowerBound

float lowerBound

Darabolás határai.

◆ magnification

float magnification

◆ renderMap

renderObject*** renderMap = NULL

Darabolás mátrixa.

◆ rightBound

float rightBound

◆ rightMostBound

int rightMostBound

◆ rows

float rows

Ennyi látszik a pályából [m].

◆ topBound

int topBound

◆ upperBound

float upperBound

◆ watchBounds

bool watchBounds = false

Feldarabolós rajzolás van-e?