Warsztat » Forum

[DirectX] Obrót wokół własnej osi

Mar 18, 2010 | Ogniok |
5 wypowiedzi na 1 stronach:
1
Ogniok
Mar 18, 2010

Obrót wokół własnej osi

Mam program pisany w DirectX. Wyświetla trójkąt po lewej stronie ekranu. Współrzędne:

Kod: 

Vector(-3, -1.5, 0)
Vector(-2,  1.5, 0)
Vector(-1, -1.5, 0)


Wyświetla się on dobrze. Teraz chcę go obracać wokół własnej osi. Macierz widoku i projekcji już ustawiłem, i ustawiam macierz świata:
Kod: D3DXMatrixRotationYawPitchRoll(&matrixRotation, D3DXToRadian(angle), 0, 0);

po czym renderuje:
Kod: 

pDev->SetTransform(D3DTS_WORLD, &matrix.getMatrix());
pDev->SetFVF(DEFAULT_VERTEX_FVF);
pDev->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pDev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);


matrix.getMatrix() zwraca macierz danego obiektu, w tym wypadku trójkąta.
I trójkąt zamiast obracać się wokół własnej osi, obraca się wokół środka ekranu. Tak się dzieje zapewne dlatego, że ustawiam transformacje jako transformacje świata. I pewnie powinno być tak, że zamiast takich współrzędnych powinienem mieć takie:
Kod: 

Vector(-1, -1.5, 0)
Vector(0,   1.5, 0)
Vector(1,  -1.5, 0)


I wtedy obracał by się wokół własnej osi. I jakbym wstawił drugi trójkąt to to samo tylko przed jego wyświetleniem translate o różnice między nimi.
Tylko, że mnie to nie satysfakcjonuje. Chciałbym móc podawać takie współrzędne a jakiś kod przeliczał by je na odpowiednie i dodawał odpowiedni translate przed renderingiem. Tylko jak to zrobić? A może jest na to jakiś inny sposób?
Zielony
Mar 19, 2010

Odp: Obrót wokół własnej osi

Zrób mniej więcej tak, jak to opisałeś, czyli najpierw rotacja trójkąta, potem przesunięcie do miejsca, w którym trójkąt ma się znajdować. Dla pełni szczęścia możesz jeszcze dołożyć skalowanie przed rotacją.
Transformacja, którą ustawiasz, to nie transformacja świata, tylko transformacja z przestrzeni obiektu do przestrzeni świata.
Ogniok
Mar 16, 2010

Odp: Obrót wokół własnej osi

Kod: 

Vector(-3, -1.5, 0)
Vector(-2,  1.5, 0)
Vector(-1, -1.5, 0)


Mając takie współrzędne wierzchołków trójkąta jak z nich obliczyć jaką transformacje ustawić i jakie wartości wtedy im ustawić by trójkąt był w miejscu wskazywanym przez wierzchołki i po rotacji obracał się wokół własnej osi?

Pewnie musiał bym mieć takie wierzchołki:

Kod: 

Vector(-1, -1.5, 0)
Vector(0,  1.5, 0)
Vector(1, -1.5, 0)


i transformacje x = -2. Tylko jak to obliczyć? Jak to obliczyć gdy obiekt jest wielokątem i ma n wierzchołków?
Zielony
Mar 17, 2010

Odp: Obrót wokół własnej osi

Bo ja wiem, choćby policz środek ciężkości. Albo jeszcze lepiej umieść model w środku układu współrzędnych od razu na etapie modelowania.
Ogniok
Mar 17, 2010

Odp: Obrót wokół własnej osi

OK Dzięki
Strony:
1