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

[opengl] rysowanie lustrzane

Ostatnio zmodyfikowano 2015-07-12 20:42
Autor Wiadomość
1aam2am1
Temat założony przez niniejszego użytkownika
[opengl] rysowanie lustrzane
» 2015-07-12 00:40:16
Mam pytanie. Czy jest możliwość ustawienia sceny tak. Aby elementy rysowane były odbite według określonej prostej pionowej.

[EDIT]
Rozwiązałem problem ręcznie zmieniając pozycje itd... według prostej pionowej

[EDIT 2]
Szukałem tego ponieważ nie znalazłem tego w sfml.
Rozwiązanie jest w sfml.
Jeżeli ktoś chce to udostępnię kod.
P-134584
Kaikso
» 2015-07-12 01:25:30
Chętnie zobaczyłbym kod, sam programuję w OpenGL i to rozwiązanie może mi się kiedyś przydać ;)
P-134586
1aam2am1
Temat założony przez niniejszego użytkownika
» 2015-07-12 15:35:12
Rozwiązanie jest w sfml. Ale o ile wiem ono pracuje w opengl więc powinno się dać przełożyć ten kod

C/C++
sf::Sprite s0; //ten sprite istnieje i jest ustrawiony w normalny sposob gdzies w kodzie

//...

float odbicie = 0; //jest to x prostej pionowej

sf::Sprite s1;
s1.setTexture( * s0.getTexture(), true );

s1.setTextureRect( sf::IntRect( s1.getTexture()->getSize().x, 0, - s1.getTexture()->getSize().x, s1.getTexture()->getSize().y ) ); //odwracam teksture

s1.setPosition( 2 * odbicie - static_cast < float >( s1.getTexture()->getSize().x + 1 + s0.getPosition().x ), 0 );
//ustalam pozycje według długości tekstury i pozycji odbicia
// + 1 jest niepotrzebne (gdy jest linia pikseli jest jakby lustrem, gdy niema linia pomiędzy pikselami jest nim)

s1.setOrigin( s1.getTexture()->getSize().x - s0.getOrigin().x, s0.getOrigin().y );
s1.move( s1.getTexture()->getSize().x, s0.getPosition().y );


s1.setRotation( - s0.getRotation() ); //ustalam nową inf o rotacji


window.draw( s1, states );

To powinno być z grubsza wszystko.
P-134594
Kaikso
» 2015-07-12 17:11:16
Mogę się mylić gdyż nie znam SFML-a ale to mi wygląda na zwykłą symetrie osiową, a taką można zaprogramować prościej.
P-134597
1aam2am1
Temat założony przez niniejszego użytkownika
» 2015-07-12 17:37:59
Jak? Byłbym wdzięczny.
P-134598
Kaikso
» 2015-07-12 18:38:00
Poczytałem trochę o SFML i wydaje mi się że linijki związane z
s1.getTexture()->getSize().x
 można jakoś zredukować.

@edit

Tak to powinno chyba wyglądać:
C/C++
sf::Sprite s0; //ten sprite istnieje i jest ustrawiony w normalny sposob gdzies w kodzie

//...

float odbicie = 0; //jest to x prostej pionowej

sf::Sprite s1;
s1.setTexture( * s0.getTexture(), true );

s1.setTextureRect( sf::IntRect( s1.getTexture()->getSize().x, 0, s1.getTexture()->getSize().x, s1.getTexture()->getSize().y ) ); //odwracam teksture

s1.setPosition( 2 * odbicie - static_cast < float >( /*s1.getTexture()->getSize().x +*/ 1 + s0.getPosition().x ), 0 );
//ustalam pozycje według długości tekstury i pozycji odbicia
// + 1 jest niepotrzebne (gdy jest linia pikseli jest jakby lustrem, gdy niema linia pomiędzy pikselami jest nim)

s1.setOrigin( s1.getTexture()->getSize().x - s0.getOrigin().x, s0.getOrigin().y );
s1.move( /*s1.getTexture()->getSize().x*/ 0, s0.getPosition().y );


s1.setRotation( - s0.getRotation() ); //ustalam nową inf o rotacji


window.draw( s1, states );

Testowałem i działa poprawnie
P-134599
pekfos
» 2015-07-12 19:54:24
Ujemna skala w sf::Sprite odwraca obraz względem osi.
P-134602
1aam2am1
Temat założony przez niniejszego użytkownika
» 2015-07-12 20:42:32
Przykro mi twój kod. Nie działa u mnie.
P-134603
« 1 »
  Strona 1 z 1