A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
Következő változat | Előző változat | ||
muszaki_informatika:raylib_vis_functions [2024/01/28 17:11] knehez létrehozva |
muszaki_informatika:raylib_vis_functions [2024/02/28 10:11] (aktuális) knehez |
||
---|---|---|---|
Sor 1: | Sor 1: | ||
+ | ====== 2D alap kiinduló kód ====== | ||
+ | A következő programváz jó kiinduló pont a 2D grafikai fejlesztésekhez. | ||
+ | <sxh c> | ||
+ | #include <raylib.h> | ||
+ | |||
+ | int main() { | ||
+ | // Initialization | ||
+ | const int screenWidth = 800; | ||
+ | const int screenHeight = 450; | ||
+ | InitWindow(screenWidth, screenHeight, "Graphics"); | ||
+ | |||
+ | SetTargetFPS(60); // Set FPS | ||
+ | |||
+ | while (!WindowShouldClose()) { // Main game loop | ||
+ | // Update | ||
+ | |||
+ | // Draw | ||
+ | BeginDrawing(); | ||
+ | |||
+ | ClearBackground(RAYWHITE); // Clear the background | ||
+ | | ||
+ | /// put here your code | ||
+ | | ||
+ | EndDrawing(); | ||
+ | } | ||
+ | CloseWindow(); | ||
+ | return 0; | ||
+ | } | ||
+ | </sxh> | ||
====== Szinusz függvény ábrázolása 2D-ben ====== | ====== Szinusz függvény ábrázolása 2D-ben ====== | ||
+ | |||
+ | Az alábbi rövid példa egy szinusz függvény ábrázolását mutatja. | ||
<sxh c> | <sxh c> | ||
Sor 55: | Sor 86: | ||
return 0; | return 0; | ||
} | } | ||
+ | </sxh> | ||
+ | A 6. és 7. sorban megadjuk a képernyő méretet pixelekben. Ezt a két értéket kapja meg paraméterként az //InitWindow()// függvény. | ||
+ | |||
+ | A 22.-es sorban egy vízszintes vonalat rajzolunk a képernyő közepére. Majd egy függőlegeset ami középen metszi. | ||
+ | |||
+ | A 26. sorban kezdődő ciklus i változója szögben számol, a kezdőértéke -400 a vége +399 fok lesz. | ||
+ | |||
+ | Nem pontokban, hanem szakaszokban gondolkodunk, hogy folytonos legyen a kirajzolás, ezért a 30. sorban 1 fokkal jobbra is kiszámoljuk a függvényt értékét. A 29. sorban az y1 értéke -1 és +1 közzé esik a sin() definíciója miatt ezért beszorozzuk 100-al, hogy függőlegesen széthúzzuk. | ||
+ | |||
+ | A 34. sortól azért számoljuk át az értékeket, mert a koordináta rendszer kezdőpontja valójában a bal felső sarokban van és a függőleges tengely fentről lefelé növekszik. | ||
+ | |||
+ | ===== Térbeli ábrázolás ===== | ||
+ | |||
+ | A következő példa egy kétváltozós függvényt **sinf(sqrtf(x*x + y*y))** térben ábrázol | ||
+ | |||
+ | <sxh c> | ||
+ | #include <raylib.h> | ||
+ | #include <math.h> | ||
+ | |||
+ | int main() { | ||
+ | // Initialization | ||
+ | const int screenWidth = 800; | ||
+ | const int screenHeight = 800; | ||
+ | InitWindow(screenWidth, screenHeight, "3D Sinus Function Plot - raylib"); | ||
+ | |||
+ | // Define the camera | ||
+ | Camera camera = { 0 }; | ||
+ | camera.position = (Vector3){ 20.0f, 20.0f, 20.0f }; | ||
+ | camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||
+ | camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||
+ | camera.fovy = 45.0f; | ||
+ | |||
+ | SetTargetFPS(60); | ||
+ | |||
+ | while (!WindowShouldClose()) { | ||
+ | BeginDrawing(); | ||
+ | ClearBackground(RAYWHITE); | ||
+ | BeginMode3D(camera); | ||
+ | |||
+ | for (float y = -8.0f; y < 8.0f; y += 0.2f) { | ||
+ | for (float x = -8.0f; x < 8.0f; x += 0.2f) { | ||
+ | float z = sinf(sqrtf(x*x + y*y)) * 2.0f; // Amplitude increase for better visualization | ||
+ | Vector3 pos = { x, z, y }; | ||
+ | float colorIntensity = (z + 2.0f) / 4.0f; // Normalize z value to [0, 1] for color | ||
+ | Color color = ColorFromHSV(200.0f * colorIntensity, 0.8f, 0.8f); | ||
+ | DrawCubeV(pos, (Vector3){0.2f, 0.1f, 0.2f}, color); | ||
+ | } | ||
+ | } | ||
+ | DrawGrid(20, 1.0f); | ||
+ | EndMode3D(); | ||
+ | DrawFPS(10, 10); | ||
+ | EndDrawing(); | ||
+ | } | ||
+ | CloseWindow(); | ||
+ | return 0; | ||
+ | } | ||
</sxh> | </sxh> | ||
+ | |||
+ | **Hogyan lehetne z tengely körül forgatni a függvényt?** | ||
+ | |||
+ | Ahhoz, hogy a 3D-s sinus felület forogjon a Z tengely körül, frissíteni kell a kamerapozíciót a fő cikluson belül, hogy a kamera mozogjon a felület körül. A kamera mozgatásához polár koordinátákat használunk, és változtatjuk a kamera position vektorát a Z tengely körüli körpályán. | ||
+ | |||
+ | Viszont a számítógépes grafikában az y tengely a felfelé mutató vektor, ezért a kódban az x és z tengelyeket forgatjuk. | ||
+ | |||
+ | <sxh c> | ||
+ | #include <raylib.h> | ||
+ | #include <math.h> | ||
+ | |||
+ | int main() { | ||
+ | // Initialization | ||
+ | const int screenWidth = 800; | ||
+ | const int screenHeight = 800; | ||
+ | InitWindow(screenWidth, screenHeight, "3D Sinus Function Rotating - raylib"); | ||
+ | |||
+ | // Define the camera | ||
+ | Camera camera = { 0 }; | ||
+ | camera.position = (Vector3){ 30.0f, 20.0f, 3.0f }; | ||
+ | camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||
+ | camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||
+ | camera.fovy = 45.0f; | ||
+ | |||
+ | |||
+ | SetTargetFPS(60); | ||
+ | float angle = 0.0f; | ||
+ | |||
+ | while (!WindowShouldClose()) { | ||
+ | // Update camera position | ||
+ | angle += 0.01f; // Increment angle | ||
+ | camera.position.x = cosf(angle) * 30.0f; | ||
+ | camera.position.z = sinf(angle) * 30.0f; | ||
+ | |||
+ | BeginDrawing(); | ||
+ | ClearBackground(RAYWHITE); | ||
+ | BeginMode3D(camera); | ||
+ | |||
+ | for (float y = -8.0f; y < 8.0f; y += 0.2f) { | ||
+ | for (float x = -8.0f; x < 8.0f; x += 0.2f) { | ||
+ | float z = sinf(sqrtf(x*x + y*y)) * 2.0f; // Amplitude increase for better visualization | ||
+ | Vector3 pos = { x, z, y }; | ||
+ | float colorIntensity = (z + 2.0f) / 4.0f; // Normalize z value to [0, 1] for color | ||
+ | Color color = ColorFromHSV(200.0f * colorIntensity, 0.8f, 0.8f); | ||
+ | DrawCubeV(pos, (Vector3){0.2f, 0.1f, 0.2f}, color); | ||
+ | } | ||
+ | } | ||
+ | DrawGrid(20, 1.0f); | ||
+ | EndMode3D(); | ||
+ | DrawFPS(10, 10); | ||
+ | EndDrawing(); | ||
+ | } | ||
+ | CloseWindow(); | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </sxh> | ||
+ |