• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed SFML origin, rotacja

0 głosów
229 wizyt
pytanie zadane 19 lutego 2017 w C i C++ przez Munvik Dyskutant (8,270 p.)
zamknięte 19 lutego 2017 przez Munvik

Nie mogę pojąć jak dokładnie działa origin

Chciałbym aby obiekt się obracał wokół jego środka bez zmiany pozycji.

Robię coś takiego:

crossbow.setOrigin(crossbow.getGlobalBounds().width / 2, crossbow.getGlobalBounds().height / 2 ); //żeby origin był na środku obiektu
crossbow.setRotation(rot);
crossbow.setOrigin(0.f, 0.f); //powrót, żeby obiekt narysował się na jego pierwotnej pozycji

I nie działa to poprawnie.

komentarz zamknięcia: Złe użycie origin
komentarz 19 lutego 2017 przez QizmoPL Stary wyjadacz (11,570 p.)

3 odpowiedzi

+2 głosów
odpowiedź 19 lutego 2017 przez Pajdas Mądrala (5,990 p.)
Origin to ustawienie tak jakby centrum obiektu.
Najlepszym przykładem jest koło.

Jeżeli stworzysz koło w sfml i umieścisz na pozycji (0,0) to właśnie na tej pozycji będzie lewy górny róg najmniejszej przestrzeni w której mieści się owe koło, ale jeżeli ustawisz origin na pozycji (promień koła, promień koła) a później umieścisz na pozycji 0,0 to zauważysz, że w miejscu 0,0 znajduje się dokładny środek koła.

Jak wiesz pewnie z lekcji fizyki ruch to "zmiana położenia względem układu odniesienia". Układem odniesienia domyślnie ustawionym w SFML jest wspomniany wcześniej lewy górny róg przestrzeni zawierającej obiekt, a funkcja setOrigin() pozwala zmieniać punkt odniesienia.
1
komentarz 19 lutego 2017 przez Munvik Dyskutant (8,270 p.)
Zrozumiałem dzięki, już kod śmiga :)
0 głosów
odpowiedź 19 lutego 2017 przez C☺ndzi Stary wyjadacz (12,200 p.)
A jak usuniesz trzecią linijkę to jak się rysuje?
komentarz 19 lutego 2017 przez Munvik Dyskutant (8,270 p.)
Podobnie tylko w innym miejscu jest sprite
0 głosów
odpowiedź 19 lutego 2017 przez Criss Mędrzec (171,180 p.)
edycja 20 lutego 2017 przez Criss
To tak nie zadziała. Wszystkie transformacje (rotacja, pozycja, skala i origin) są brane pod uwagę dopiero w chwili renderowania i na ich podstawie wyliczana odpowiednia macierz. Także nie ma znaczenia w jakiej kolejności wywołasz setOrigin, setRotation itd.
komentarz 19 lutego 2017 przez Munvik Dyskutant (8,270 p.)
Zrozumiałem, dzięki, teraz kod działa tak jak należy
komentarz 19 lutego 2017 przez Criss Mędrzec (171,180 p.)
Przejrzyj sobie klasę sf::Transform. Tzn jej kod.

Podobne pytania

0 głosów
1 odpowiedź 110 wizyt
pytanie zadane 5 czerwca 2016 w C i C++ przez Maciek123233 Gaduła (3,210 p.)
0 głosów
0 odpowiedzi 98 wizyt
pytanie zadane 29 kwietnia 2017 w C i C++ przez Pajdas Mądrala (5,990 p.)
0 głosów
2 odpowiedzi 155 wizyt
pytanie zadane 6 grudnia 2016 w C i C++ przez 10kw10 Pasjonat (23,020 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

64,021 zapytań

110,396 odpowiedzi

231,161 komentarzy

47,800 pasjonatów

Przeglądających: 202
Pasjonatów: 2 Gości: 200

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...