Przekształcanie współrzędnych kątowych.

Polish forum

Moderator: PrzemoF

Forum rules
Regulamin forum i pomocne informacje

WAŻNE! Przeczytaj zanim poprosisz o pomoc
User avatar
arturromarr
Posts: 184
Joined: Sat Jun 24, 2017 9:32 pm

Przekształcanie współrzędnych kątowych.

Postby arturromarr » Fri Oct 18, 2019 6:02 pm

Cześć,
Zna ktoś wzory do przeliczenia współrzędnych kątowych z obrotu względem trzech osi współrzędnych na te, które są podawane w sekcji Placement czyli Angle i Axis?
Chodzi mi, żeby wyliczyć z wartości trzech kątów na jeden kąt i trzy wektory.
User avatar
kaktus
Posts: 60
Joined: Sun Aug 11, 2019 11:59 am
Location: opolskie
Contact:

Re: Przekształcanie współrzędnych kątowych.

Postby kaktus » Sun Oct 20, 2019 7:05 pm

Witam.
:mrgreen:

Czytam, i jakoś nie dociera do mnie.

Może pokażesz szkic, dla zobrazowania?
wierny padawan mistrza arturromarr
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest".
User avatar
arturromarr
Posts: 184
Joined: Sat Jun 24, 2017 9:32 pm

Re: Przekształcanie współrzędnych kątowych.

Postby arturromarr » Mon Oct 21, 2019 7:33 am

Jak w praktyce chcę obrócić element o np. 30 stopni wokół osi X, o 5 stopni wokół Y i 15 stopni wokół Z, to co mam wpisać w sekcji Placement elementu gdzie jest jeden kąt i trzy przemieszczenia.
Wzory mi są potrzebne do automatycznego przeliczania tych wielkości.
User avatar
PrzemoF
Posts: 2654
Joined: Fri Jul 25, 2014 4:52 pm
Contact:

Re: Przekształcanie współrzędnych kątowych.

Postby PrzemoF » Mon Oct 21, 2019 7:43 am

Jeżeli dobrze kojarzę to położenie definiuje się:
- położeniem
- osią (wektor)
- obrotem wokół tej osi

Tu jest trochę na ten temat [1]. Jest kilka funkcji pomocniczych. Jeżeli nie znajdziesz tam tego czego szukasz to napisz.

[1] https://forum.freecadweb.org/viewtopic.php?t=576
kwahoo
Posts: 235
Joined: Fri Nov 29, 2013 3:09 pm
Contact:

Re: Przekształcanie współrzędnych kątowych.

Postby kwahoo » Sat Nov 02, 2019 11:58 am

Najprościej jest użyć Edit->Placement i zaznaczyć Apply incremental changes i potem po kolei obracać o kolejne kąty.

Jeśli jednak chcesz wyliczyć finalny obrót w jakimś skrypcie, to musisz pomnożyć kolejne rotacje

Code: Select all

from pivy.coin import SbRotation
from pivy.coin import SbVec3f
rot0 = SbRotation(SbVec3f(0, 0, 1), 1.5707963) #oś, kąt w radianach
rot1 = SbRotation(SbVec3f(0, 1, 0), 1.5707963)
rot2 = rot0 * rot1 #kolejność ma znaczenie
rot2.getValue()  #wyciągamy kwaternion
(0.4999999701976776, 0.5, 0.5, 0.5000000596046448)
Wynikiem jest kwaternion, który pewnie Cię nie satysfakcjonuje, więc możemy spróbować wyciągnąć oś obrotu oraz kąt obrotu:

Code: Select all

rot2.getAxisAngle()[0].getValue() #oś obrotu
(0.5773502588272095, 0.5773502588272095, 0.5773502588272095)
rot2.getAxisAngle()[1] #kat obrotu w radianach
2.0943949222564697
User avatar
arturromarr
Posts: 184
Joined: Sat Jun 24, 2017 9:32 pm

Re: Przekształcanie współrzędnych kątowych.

Postby arturromarr » Wed Nov 06, 2019 9:36 am

kwahoo wrote:
Sat Nov 02, 2019 11:58 am
Najprościej jest użyć Edit->Placement i zaznaczyć Apply incremental changes i potem po kolei obracać o kolejne kąty.
Tak właśnie nie mogę, chociaż dokładnie o ten efekt mi chodzi.
Potrzebuję to w formie równań, które będę mógł użyć do automatycznego wyliczania położenia elementów projektu.
Konkretnie, cel jest taki, żeby w wygodny sposób w szkicowniku móc ustawić w dowolny sposób tego "kolegę":
Attachments
Screenshot_20191106_103420.png
manekin Ferdynand Ciosany
Screenshot_20191106_103420.png (111.88 KiB) Viewed 132 times
kwahoo
Posts: 235
Joined: Fri Nov 29, 2013 3:09 pm
Contact:

Re: Przekształcanie współrzędnych kątowych.

Postby kwahoo » Thu Nov 07, 2019 5:32 pm

arturromarr wrote:
Wed Nov 06, 2019 9:36 am

Potrzebuję to w formie równań, które będę mógł użyć do automatycznego wyliczania położenia elementów projektu.
Nie o o taki efekt Ci chodziło?
calc.png
calc.png (109 KiB) Viewed 115 times
Obrót o 90 stopni wokół Z:

Code: Select all

rot0 = SbRotation(SbVec3f(0, 0, 1), 1.5707963)
Obrót o 90 stopni wokół Y:

Code: Select all

rot1 = SbRotation(SbVec3f(0, 1, 0), 1.5707963)
Jeśli koniecznie chcesz to liczyć samodzielnie, a nie zdawać się na wbudowane biblioteki, to możesz to zrobić tak:
1) skonwertować kolejne obroty oś-kąt do macierzy http://www.euclideanspace.com/maths/geo ... /index.htm
2) pomnożyć kolejne macierze
3) wyciągnąć finalną oś-obrót z wynikowej macierzy http://www.euclideanspace.com/maths/geo ... /index.htm