2013-08-21 10 views
5

Znam macierze transformacji dla rotacji, skalowania, translacji itd. Znam także matrycę dla transformacji ścinania. Teraz muszę mieć ścinanie matrix--Shear Matrix jako połączenie podstawowej transformacji?

[1 Sx 0] 
[0 1 0] 
[0 0 1] 

w postaci kombinacji pozostałych wspomnianych przekształceń. Próbowałem wyszukiwać, próbowałem "burzy mózgów", ale nie mogłem uderzyć! Dzięki!

+0

Tłumaczenie i skalowanie nie będą miały wpływu na ścinanie, ponieważ działają one na różnych elementach macierzy. Rotacja może składać się z 3 nożyc, ale nie słyszałem o tym, żeby zrobić to na odwrót. Czy możesz ewentualnie przeformułować pytanie? Dlaczego macie tę macierz, aby składać się z innych transformacji? Ponadto, po skomponowaniu ostatecznej macierzy, nie masz możliwości dowiedzenia się, w jaki sposób została oryginalnie skomponowana, ponieważ wiele różnych kombinacji może prowadzić do tego wyniku, więc jaka jest okoliczność, w której jest to potrzebne? – user1118321

Odpowiedz

6

Działanie na ścinanie x kąt ścinania theta minimalizuje rotacji i skalowania w następująco:

(a) obracają się theta/2 przeciwnym do ruchu wskazówek zegara.

(b) Skala z x-scaling factor = sin(theta/2) i y-scaling factor = cos(theta/2).

(c) Obrót o 45 degree zgodnie z ruchem wskazówek zegara.

(d) Skala z x-scaling factor = sqrt(2)/sin(theta) i y-scaling factor= sqrt(2).

3

Nożyce są elementarną operacją macierzową, więc można je wyrazić jako "kombinację innych operacji macierzowych", czyniąc to jest naprawdę dziwne. Nożyce przyjmują dwie formy:

| 1 V | | 1 0 | 
| 0 1 | , | V 1 | 

mając na uwadze, że macierz obrotu jest znacznie bardziej zaangażowana; pomysł wyrażania ścinania za pomocą rotacji sugeruje, że jeszcze nie napisałeś tych rzeczy, aby zobaczyć, czego potrzebujesz, więc spójrzmy na to. Matryca obrotowy ma postać:

| cos -sin | 
| sin cos | 

który może być skomponowany jako sekwencji trzech poszczególnych matryc ścinania, R = Sx x Sy x Sx:

| cos(a) -sin(a) | |  1  0 | | 1 sin(a) | |  1  0 | 
|    | = |    | x |   | x |    | 
| sin(a) cos(a) | | -tan(a/2) 1 | | 0 1 | | -tan(a/2) 1 | 

Teraz można zrobić kilka trywialne manipulacja matrycą, aby uzyskać Sy. Pierwszy od lewej mnożyć:

 R = Sx x Sy x Sx 
Sx⁻¹ x R = Sx⁻¹ x Sy x Sx 
Sx⁻¹ x R = I x Sy x Sx 
Sx⁻¹ x R = Sy x Sx 

a następnie kliknij prawym mnożyć:

Sx⁻¹ x R x Sx⁻¹ = Sy x Sx x Sx⁻¹ 
Sx⁻¹ x R x Sx⁻¹ = Sy x I 
Sx⁻¹ x R x Sx⁻¹ = Sy 

Jako trywialny przepisać jeden ścinanie jest teraz dwa nożyce i obrót.

Ale o wiele ważniejsze pytanie brzmi: dlaczego trzeba wyrazić matrycę ścinania jako coś innego? Jest to już elementarna matryca, jakie dziwne środowisko komputerowe jest w tobie, lub jakie szalone rzeczy próbujesz zrobić, to wymaga wyrażenia elementarnej transformacji jako bardziej złożonej, wolniejszej do obliczenia? =)

4

Tak, można to zrobić, obrót, a następnie nierównomierne skalowanie i odwrotne obracanie. Możesz znaleźć szczegóły tutaj w trzecim pytaniu http://www.cs.cmu.edu/~djames/15-462/Fall03/assts/15-462-Fall03-wrAssign1-answer.pdf. możesz wypróbować także poniższy kod OpenGL. Obraca prostokąt o 45 stopni, a następnie skaluje na osi X. a następnie obraca się w -26 stopni, to znaczy atan (0,5). 0,5 pochodzi od znalezienia kąta pomiędzy osią x i jedną stroną po skalowaniu w kierunku x.

glRotatef (-26.0, 0.0, 0.0, 1.0);

glScalef (2,1,1);

glRotatef (45,0, 0,0, 0,0, 1,0);

glRectf (0, 0, 25.0, 25.0);