AP1994 Temat założony przez niniejszego użytkownika |
jak ustawić perspektywę widzenia w allegro c++ » 2023-11-08 15:42:22 Chciałem uzyskać efekt perspektywy ze względu na oś z tego, co rysuję. Próbowałem użyć: "al_perspective_transform", ale zawartość ekranu znika po wywołaniu: "al_use_projection_transform". Jeżeli ktoś wie jak uzyskać perspektywę w allegro 5 to, proszę napisać. Mogą być ogólniki. |
|
DejaVu |
» 2023-11-08 16:20:35 https://chat.openai.com/share/abe049fb-013a-4f95-9157-a2b99f279ed9Anonymous C++, Chciałem uzyskać efekt perspektywy ze względu na oś z tego, co rysuję. Próbowałem użyć: "al_perspective_transform", ale zawartość ekranu znika po wywołaniu: "al_use_projection_transform". Jeżeli ktoś wie jak uzyskać perspektywę w allegro 5 to, proszę napisać. Mogą być ogólniki. ChatGPT ChatGPT Aby uzyskać efekt perspektywy w Allegro 5, kluczowe jest zrozumienie, jak używać transformacji i projektowania perspektywicznego. Oto ogólne kroki, które mogą Ci pomóc:
Ustawienie transformacji perspektywicznej:
Użyj funkcji al_perspective_transform do utworzenia transformacji perspektywicznej. Ta funkcja potrzebuje parametrów, takich jak pozycja kamery, punkt, na który kamera jest skierowana, i kierunek "w górę" w przestrzeni 3D. Przykład: al_perspective_transform(&transform, 0, 0, 1, 0, 0, 0, 0, 1, 0); Zastosowanie transformacji:
Po utworzeniu transformacji perspektywicznej, użyj al_use_projection_transform do zastosowania tej transformacji. Pamiętaj, że po zastosowaniu tej funkcji, wszystkie rysowania będą przekształcane przez tę transformację. Rysowanie obiektów:
Teraz możesz rysować obiekty w przestrzeni 3D. Allegro 5 automatycznie przekształci je, aby stworzyć efekt perspektywy. Diagnostyka problemów:
Jeśli ekran staje się pusty po zastosowaniu transformacji, to może to być spowodowane błędnie ustawionymi parametrami transformacji. Sprawdź, czy kamera nie jest ustawiona wewnątrz rysowanego obiektu, czy kierunki są poprawnie ustawione, a pole widzenia jest odpowiednie. Może być konieczne dostosowanie skali lub położenia obiektów, aby były one widoczne w obrębie przekształconej przestrzeni. Eksperymentowanie:
Perspektywa w grafice 3D często wymaga eksperymentowania z różnymi ustawieniami, aby osiągnąć pożądany efekt. Nie wahaj się eksperymentować z różnymi wartościami transformacji. Dokumentacja i przykłady:
Polecam również zapoznać się z dokumentacją Allegro 5 i szukać przykładów użycia transformacji perspektywicznych, które mogą dać lepszy wgląd w to, jak to działa. Jeśli napotykasz konkretny problem z kodem, możesz również podać fragmenty kodu, które sprawiają problem, aby uzyskać bardziej szczegółową pomoc.
Anonymous napisz działający kod ChatGPT ChatGPT Oczywiście! Poniżej znajdziesz prosty przykładowy kod w C++ z użyciem biblioteki Allegro 5, który demonstruje, jak osiągnąć efekt perspektywy. Ten kod zakłada, że masz już zainstalowaną i skonfigurowaną bibliotekę Allegro 5.
Zakładam tutaj, że chcesz narysować prostokąt w perspektywie. Użyję podstawowych funkcji Allegro do stworzenia okna, ustawienia transformacji perspektywicznej, i narysowania prostokąta.
cpp Copy code #include <allegro5/allegro.h> #include <allegro5/allegro_primitives.h>
int main() { // Inicjalizacja Allegro i tworzenie okna al_init(); al_init_primitives_addon(); ALLEGRO_DISPLAY* display = al_create_display(800, 600);
// Ustawienia transformacji perspektywicznej ALLEGRO_TRANSFORM transform; al_identity_transform(&transform); al_perspective_transform(&transform, -4, -3, 5, 4, 3, -5, 0, 1, 0); al_use_projection_transform(&transform);
// Główna pętla while (true) { // Rysowanie sceny al_clear_to_color(al_map_rgb(0, 0, 0));
// Rysowanie prostokąta al_draw_filled_rectangle(1, 1, 2, 2, al_map_rgb(255, 0, 0));
al_flip_display();
// Prosta obsługa zdarzeń (zamknięcie okna) ALLEGRO_EVENT_QUEUE* event_queue = al_create_event_queue(); al_register_event_source(event_queue, al_get_display_event_source(display)); ALLEGRO_EVENT ev; al_wait_for_event(event_queue, &ev);
if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { break; }
al_destroy_event_queue(event_queue); }
// Sprzątanie al_destroy_display(display); return 0; } Ten kod robi następujące rzeczy:
Inicjalizuje Allegro i tworzy okno. Ustawia transformację perspektywiczną. W głównej pętli, rysuje prostokąt w perspektywie. Obsługuje zdarzenia, takie jak zamknięcie okna. Upewnij się, że masz zainstalowane Allegro 5 i jego dodatki, zwłaszcza moduł primitives, aby ten kod działał poprawnie. Kod ten jest tylko przykładem i może wymagać dostosowania do Twoich konkretnych potrzeb.
Anonymous wyjaśnij znaczenia argumentów przekazywanych do funkcji al_perspective_transform ChatGPT ChatGPT Funkcja al_perspective_transform w Allegro 5 jest używana do tworzenia transformacji perspektywicznej, która jest kluczowa do uzyskania efektu głębi w grafice 3D. Oto wyjaśnienie poszczególnych argumentów tej funkcji:
transform:
Jest to wskaźnik na strukturę ALLEGRO_TRANSFORM, do której zapisywane są wyniki transformacji. Ta struktura reprezentuje macierz transformacji 4x4 używaną do przekształcania współrzędnych 3D. fovy:
Jest to kąt widzenia w osi Y (pionowej). Określa to, jak szeroki jest "stożek widzenia" kamery. Wartość jest podawana w radianach. Węższy kąt (mniejsza wartość) spowoduje, że obiekty wydają się być dalej, podczas gdy szerszy kąt (większa wartość) spowoduje, że obiekty wydają się być bliżej. aspect:
To stosunek szerokości do wysokości obszaru renderowania (np. okna). Wpływa to na to, jak obrazy są skalowane w poziomie w stosunku do pionu. Nieprawidłowa wartość może spowodować rozciągnięcie lub ściskanie obrazu. zNear:
Określa odległość od kamery do najbliższej płaszczyzny odcięcia. Obiekty znajdujące się bliżej niż ta odległość nie będą widoczne. Jest to używane do określenia, jak blisko kamery mogą znajdować się obiekty przed ich "zniknięciem" z pola widzenia. Wartość musi być większa niż 0. zFar:
Określa odległość od kamery do najdalszej płaszczyzny odcięcia. Obiekty znajdujące się dalej niż ta odległość nie będą widoczne. Jest to używane do określenia, jak daleko od kamery mogą znajdować się obiekty, zanim przestaną być renderowane. Wartość musi być większa niż zNear. Podsumowując, funkcja al_perspective_transform konfiguruje sposób, w jaki scena 3D jest projekowana na dwuwymiarową płaszczyznę ekranu, określając kąt widzenia, proporcje ekranu oraz zakres widocznych odległości. Dobrze dobrane parametry pomagają w stworzeniu realistycznego efektu głębi i przestrzenności w grafice 3D.
|
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2023-11-08 16:53:22 al_perspective_transform ma argumenty: void al_perspective_transform(ALLEGRO_TRANSFORM *trans,float left, float top, float n,float right, float bottom, float f), a nie: void al_perspective_transform(ALLEGRO_TRANSFORM *transform,float fovy, float aspect,float zNear,float zFar) |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2023-11-08 20:14:34 zaczeło mi się wyświetlać jak skasowałem al_clear_to_color(al_map_rgb(0,0,0)); miałem w kodzie for( int i = 0; i < 10; i++ ) { draw_rect( i * 50, i * 50, 50, 50, al_map_rgb( 255, 0, 0 ) ); draw_rect(( szr_monitora - 50 ) -( i * 50 ), i * 50, 50, 50, al_map_rgb( 0, 255, 0 ) ); draw_rect( i * 50,( wys_monitora - 50 ) -( i * 50 ), 50, 50, al_map_rgb( 0, 0, 255 ) ); draw_rect(( szr_monitora - 50 ) -( i * 50 ),( wys_monitora - 50 ) -( i * 50 ), 50, 50, al_map_rgb( 255, 0, 255 ) ); } al_flip_display(); al_clear_to_color( al_map_rgb( 0, 0, 0 ) );
|
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2023-11-09 22:29:25 nie umiem sprawić żeby po wywołaniu scena.use(); obraz się poruszał #include <windows.h> #include "Displays/Window.h" #include "Graphic/Shape.h" #include "resouce.h" using namespace std; int main() { HWND OOO = GetDesktopWindow(); RECT Prostokat; GetWindowRect( OOO, & Prostokat ); int szr_monitora = Prostokat.right - Prostokat.left; int wys_monitora = Prostokat.bottom - Prostokat.top; Window okno; if( !al_init() ) { al_show_native_message_box( 0, "error", "Nie zainicjowano", " biblioteki allegro 5", 0, ALLEGRO_MESSAGEBOX_ERROR ); return 0; } al_set_new_display_refresh_rate( 60 ); okno.Options( ALLEGRO_RED_SIZE | ALLEGRO_GREEN_SIZE | ALLEGRO_BLUE_SIZE | ALLEGRO_ALPHA_SIZE, 64, ALLEGRO_SUGGEST ); okno.Options( ALLEGRO_DEPTH_SIZE, 64, ALLEGRO_REQUIRE ); string name = PRODUCT_NAME, version = VER_STRING; string tytul = name + " " + version; al_init_native_dialog_addon(); if( !al_install_keyboard() ) { al_show_native_message_box( 0, "error", "Nie zainicjowano klawiatury", NULL, 0, ALLEGRO_MESSAGEBOX_ERROR ); return 0; } if( !al_install_mouse() ) { al_show_native_message_box( 0, "error", "Nie zainicjowano myszy", NULL, 0, ALLEGRO_MESSAGEBOX_ERROR ); return 0; } if( !al_init_primitives_addon() ) { al_show_native_message_box( 0, "error", "Nie zainicjowano rysowania prymitywów", NULL, 0, ALLEGRO_MESSAGEBOX_ERROR ); return 0; } if( !okno.Create( 0, 0, szr_monitora, wys_monitora, ALLEGRO_NOFRAME, tytul ) ) { al_show_native_message_box( 0, "error", "Nie zainicjowano", " okna", 0, ALLEGRO_MESSAGEBOX_ERROR ); okno.Destroy(); } ALLEGRO_TIMER * Test_timer = al_create_timer( 1.0 / 60 ); al_register_event_source( okno.event_queue, al_get_timer_event_source( Test_timer ) ); bool draw = false; int x = 100, y = 100; al_start_timer( Test_timer ); Scene scena( 100, 100, 100 ); while( true ) { okno.Events(); switch( okno.event.type ) { case ALLEGRO_EVENT_DISPLAY_CLOSE: exit( 0 ); break; case ALLEGRO_EVENT_TIMER: if( okno.event.timer.source == Test_timer ) { scena.use(); if( al_key_down( & okno.klawiatura, ALLEGRO_KEY_ESCAPE ) ) { exit( 0 ); } else if( al_key_down( & okno.klawiatura, ALLEGRO_KEY_LEFT ) ) { x--; cout << x << endl; } else if( al_key_down( & okno.klawiatura, ALLEGRO_KEY_RIGHT ) ) { x++; cout << x << endl; } else if( al_key_down( & okno.klawiatura, ALLEGRO_KEY_UP ) ) { y--; cout << y << endl; } else if( al_key_down( & okno.klawiatura, ALLEGRO_KEY_DOWN ) ) { y++; scena.set_size( x, y,( x + y ) / 2 ); cout << y << endl; } else if( al_key_down( & okno.klawiatura, ALLEGRO_KEY_SPACE ) ) { } draw = true; } } if( draw ) { for( int i = 0; i < 10; i++ ) { draw_rect( x +( i * 50 ), y +( i * 50 ), 50, 50, al_map_rgb( 255, 0, 0 ) ); draw_rect( x +(( szr_monitora - 50 ) -( i * 50 ) ), y +( i * 50 ), 50, 50, al_map_rgb( 0, 255, 0 ) ); draw_rect( x +( i * 50 ), y +(( wys_monitora - 50 ) -( i * 50 ) ), 50, 50, al_map_rgb( 0, 0, 255 ) ); draw_rect( x +(( szr_monitora - 50 ) -( i * 50 ) ), y +(( wys_monitora - 50 ) -( i * 50 ) ), 50, 50, al_map_rgb( 255, 0, 255 ) ); } draw = false; al_flip_display(); al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); } } al_uninstall_keyboard(); al_uninstall_mouse(); al_uninstall_system(); al_destroy_timer( Test_timer ); okno.Destroy(); }
kod funkcji draw_rect void draw_rect( float x1, float y1, float w, float h, ALLEGRO_COLOR c ) { int x2 = w + x1; int y2 = h + y1; ALLEGRO_VERTEX vtx[ 4 ]; vtx[ 0 ].x = x1; vtx[ 0 ].y = y1; vtx[ 1 ].x = x1; vtx[ 1 ].y = y2; vtx[ 2 ].x = x2; vtx[ 2 ].y = y2; vtx[ 3 ].x = x2; vtx[ 3 ].y = y1; vtx[ 0 ].color = c; vtx[ 1 ].color = c; vtx[ 2 ].color = c; vtx[ 3 ].color = c; vtx[ 0 ].z = 0; vtx[ 1 ].z = 0; vtx[ 2 ].z = 0; vtx[ 3 ].z = 0; al_draw_prim( vtx, 0, 0, 0, 4, ALLEGRO_PRIM_TRIANGLE_FAN ); }
|
|
pekfos |
» 2023-11-13 18:04:06 Czemu próbujesz ruszać obraz perspektywą? Od tego jest raczej kamera. al_build_camera_transform() i al_use_transform(). I jak to się ma do reszty kodu? Modyfikujesz zmienne lokalne w main(), x i y w komentarzu to inne zmienne. |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2023-11-13 19:53:28 po zmianie al_use_projection_transform na al_use_transform w klasie sceny obiekty na ekranie zaczęły się poruszać |
|
« 1 » |