Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

jak ustawić perspektywę widzenia w allegro c++

Ostatnio zmodyfikowano 2023-11-13 19:53
Autor Wiadomość
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.
P-180426
DejaVu
» 2023-11-08 16:20:35
https://chat.openai.com/share/abe049fb-013a-4f95-9157-a2b99f279ed9

Anonymous
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.
P-180427
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)
P-180428
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
C/C++
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 ) );
P-180429
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ł
C/C++
#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 ); //wywołuje al_set_new_display_option
   
okno.Options( ALLEGRO_DEPTH_SIZE, 64, ALLEGRO_REQUIRE ); //wywołuje al_set_new_display_option
   
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();
   
} /*wywołuje:
 al_set_new_display_flags(flag);
    window = al_create_display( w, h );
    al_set_window_title(window,name.c_str());
    al_set_window_position(window, x, y );
    event_queue = al_create_event_queue();
    al_register_event_source( event_queue, al_get_keyboard_event_source() );
    al_register_event_source( event_queue, al_get_mouse_event_source() );
    al_register_event_source( event_queue, al_get_display_event_source(window) );*/
   
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 ); //inicjuje x,y,z wywołuje al_identity_transform(&projection);
   
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(); /*wywołuje:
    al_perspective_transform(&projection,-x,-y,-z,x,y,z);
    al_use_projection_transform(&projection);*/
               
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
C/C++
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 );
}
P-180430
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().

C/C++
scena.use(); /*wywołuje:
    al_perspective_transform(&projection,-x,-y,-z,x,y,z);
    al_use_projection_transform(&projection);*/
I jak to się ma do reszty kodu? Modyfikujesz zmienne lokalne w main(), x i y w komentarzu to inne zmienne.
P-180439
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ć
P-180440
« 1 »
  Strona 1 z 1