Toolism [ GameDev ]
Matematyka : Uzyskanie dokładnej wartości kąta miedzy 2 wektorami w 3 wy...
Szukam szukam, myslę, myślę i wymyślić nie mogę. Może ktoś z was jest dobry z trygonometrii i ogólnie z geometrii i będzie znał odpowiedz na pytanie które zaraz postawię?
Mam 2 wektory w trójwymiarze. Jeśli policzę DOT-product ( wybaczcie ale nie wiem jak to się nazywa po polsku ) otrzymam cosinus ( theta ) gdzie theta będzie równa kątowi zawartemu między nimi. Jeśli teraz wynik cosinusa( theta ) podstawię jako parametr arcusa Cosinusa
czyli coś w stylu acos( wynik cosinusa(theta ) ) to otrzymam to co mnie interesuje mianowicie THETE. Problem w tym.. ze z racji tego , iż funkcja cosinus nie jest różnowartościowa w przedziale od 0 do 2PI ... to niestety dla 1 wartości cosinusa ( theta ) dostaję 2 możliwe kąty..
przykładowo cos(45 stopni ) = w przyblizeniu 0,7017coś..
teraz acos (0.7017..) = w przyblizeniu daje 45.. czyli niby się zgadza..
ale...
cos(315 stopni) również = 0.7017.. a wiemy już że acos( 0.7017 ) da nam 45 stopni więc nie jestem w stanie otrzymać wartosci 315 stopni..
Teraz najważniejsze pytanie :)
Czy ktoś ma pomysł jak uzyskać tą wartość 315 stopni wiedząc że cos(315) = 0.7017..
Oczywiscie nie chodzi mi tylko o tę wartość a o wszystkie wartości w ogóle..;)
PS. po co mi to? Potrzebuję znać kąt miedzy dwoma wektorami bo w mojej gierce musze wiedziec o jaki kąt ma obrócić się jednostka kiedy wydam jej komendę MOVE w konkretne miejsce;)
Cainoor [ Mów mi wuju ]
DOT-product - iloczyn skalarny
Arcus cosinus masz opisany tutaj:
Wartość funkcji możesz wziąć z tablic matematycznych lub napisać prosty program, który Ci będzie to liczył. Nie jestem pewien, ale chyba Excel ma ją już w sobie zaszytą :)
Toolism [ GameDev ]
Cainoor -> czy napewno przeczytałeś to co napisałem dokładnie?
1) Umiem liczyć iloczyn skalarny
2) Umiem obliczyc arcus cosinusa.
3) moje pytanie dotyczy czego innego..
Cainoor [ Mów mi wuju ]
To sprecyzuj pytanie. Bo ja rozumiem to tak, że mając konkretną liczbę (wynik funkcji cosinus) chcesz otrzymać kąt w stopniach. Zgadza się?
Toolism [ GameDev ]
tak jest!:)
i tu leży problem bo mająć konkretną wartość można obliczyć 2 kąty a nie jeden. I moje pytanie dotyczy tego jak obliczyć jeden i drugi.
Posłużę się jeszcze raz przykładem z 1 posta.
cosinus(45stopni) = 0,7017
acos(0,7017) = 45. Tu dziala fajnie.. a teraz
cosinus(315 stopni) = RÓWNIEŻ 0,7017
acos(0,7017) da nam wynik 45 a nie 315..
Teraz jeśli wiesz ze cos(theta) = 0,7017 to ile wynosi THETA? jeśli mogą być to 2 wartości?
i jak np otrzymać z arcusa tego co wyszło wynik 315 w tym wypadku?
Cainoor [ Mów mi wuju ]
Musisz zdefiniować przedział cosinus i ograniczyć go np. tylko do [0, PI]. W takim przedziale funkcja jest malejąca, różnowartościowa, a więc posiada funkcje odwrotną (arc cos). Inaczej tego nie możesz zrobić.
Po prostu przy obliczaniu kąta w grze dodaj jeszcze jedną zmienną, która Ci powie z jakiego przedziału jest cosinus i dopiero jak ograniczysz ten przedział, licz arcusa. To chyba możesz zrobić?
Bo jeśli masz tylko samego arcusa, to dupa blada :)
Voutrin [ Snop dywizora ]
Tak jak pisze Cainoor, nie moga byc dwie wartosci( dla 45 i 315), bo funkcje arcus rozpatrujesz na zawezonym przedziale gdzie kosinus jest roznowartosciowy, a w takim przedziale funkcja okreslona jest jednoznacznie. I np mozesz wybrac przedzial [0,pi] gdzie dla arc cos (0.707) istnieje jeden kat 45 stopni.
Toolism [ GameDev ]
eeee.. no tak ale jeśli ograniczę się do tego przedziału to nie uzyskam nigdy wartości większej niż 180 stopni. a jeśli moja jednostka ma zrobić zwrot o 270?
wiem że to jest -(360 - 270 ) czyli -90 ale jakoś trzeba to obliczyć a jeśli bede miał maksymalną wartość 180 bo przecież ograniczę sobie przedział do PI to i obrót bede miał maksymalnie o 180.
Cainoor [ Mów mi wuju ]
Stwórz zmienną pomocniczą x
Jeśli kąt będzie z przedziału [0,PI] to ustaw x=0
Jeśli [PI, 2PI] to x=1
Teraz w zależności od x obliczenie arcusa da Ci odpowiedz jednoznaczną :)
Toolism [ GameDev ]
Cainoor -> wybacz ale gdybym wiedział z jakiego przedziału jest kąt to nie miałbym żadnego problemu:) Tu właśnie o ustalenie jaki to kąt chodzi. Skoro iloczyn skalarny daje mi jedynie wartość a z niej muszę wyprowadzić wartość kąta.. to jesteśmy w punkcie wyjścia... Bo wartość iloczynu skalarnego mogę interpretować dwojako.;(
Milka^_^ [ Zjem ci chleb ]
A co za różnica jaki kąt otrzymasz. Przecież są wzory redukcyjne. Jeżeli o to chodzi i dobrze zrozumiałem o co.
Cainoor [ Mów mi wuju ]
Toolism ---> Sorry, że dopiero teraz odpisuję, ale umówiłem się ze znajomymi.
Popraw mnie, jeśli się myle. Masz układ współrzędnych xyz. Masz dwa wektory opisane w tym układzie. Dobrze rozumuję?
Toolism [ GameDev ]
Cainoor -> już problem rozwiązałem:) ale dzięki za pomoc.
Mówiłeś żeby badać czy kąt jest z przedziału 0, 180 czy z przedziału 180, 360. Ja z kolei mowiłem że jest to oczywiscie swietny pomysl tylko wymaga ode mnie znajomosci kąta a tu właśnie kąt był nieznany.. aale.. zaczęło mi świtać , że to przecież znaczy czy kliknieto na prawo od obiektu (0,180) czy na lewo (180,360).... czyli wystarczyło napisać funkcję która brała obiekt i brała punkt i stwierdzała czy jest on na lewo czy na prawo od obiektu i w zależności od tego ustawiała kąt lub -kąt:) Teraz działa świetnie:) Problem jeszcze z sytuowaniem obiektu z dobrymi rotacjami względem osi Z i osi X .:) zeby mi sie juz idealnie dopasowywała do terenu ale to już raczej łatwiejsze.
Milka -> wzory redukcyjne działają czadowo ale trzeba znać tą ALFĘ której się tak namiętnie używa. A w moim problemie ALFA była niewiadomą:)
Cainoor [ Mów mi wuju ]
Właśnie o coś takiego mi chodziło, tylko nie wiedziałem jak opisujesz umiejscowienie wektorów w przestrzeni. Powodzenia :)