In 3d koord. mit kamera am umfang eines Kreises lang wandern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Ich programmiere gerade ein 3d spiel mit panda3d und bin gerade beim manuellen kamera einstellen. Es soll sowas wie ein (m)morpg werden.
Zielperson ist ein panda (x) [bei P(0,0,0)] auf den die Kamera (c) gerichtet ist.
Wenn man nun die Maus rechts gedrückt nach links/rechts bewegt, soll die kamera um den panda rotieren:

Bild

Ich habe ein 3d Koordinatensystem, dabei ist x rechts, y in den Bildschirm und z nach oben. Meine Kamera wandert im moment nur auf der x achse.
Deswegen kann man den panda nie von vorne sehen:

Code: Alles auswählen

        x
<------ c ----->
Wie kann ich das jetzt in koordinaten fassen, wenn ich z.B. den Wert 10 habe, dass die camera dann nicht 10 nach rechts wandert, sondern beim unfang 10 weiter nach rechts.

Code: Alles auswählen


        x | //<- vielleicht hier
       __/
den Umfang berechnet man mit 2r*pi / d*pi, aber wie bekommt man das so hin? Ein Kreis kann IMHO keine funktionsgleichung haben, weil 2 punkte auf das hier passen können: S(2|y).
Wie kann ich das jetzt lösen, dass die kamera im umfang 10 nach rechts geht?[/quote]
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das Stichwort lautet "trigonometrische Funktionen".
Das Leben ist wie ein Tennisball.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

dann muss ich statt dem wert den man am umfang wandern soll eine grad zahl haben, wenn ich das richtig verstanden habe oder?

http://upload.wikimedia.org/wikipedia/c ... is.svg.png
Hier die gradzahl von x?
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

x=42

Bitte antworte doch in ganzen Sätzen.

Code: Alles auswählen

cx = x + r*sin(phi)
cy = y + r*cos(phi)
(x, y) ist der Mittelpunkt X.
(cx, cy) ist der Punkt auf dem Kreis.
r der Radius.
phi der Winkel.
Das Leben ist wie ein Tennisball.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Aber phi ist der winkel in rad oder?

Code: Alles auswählen

>>> math.sin(362) == math.sin(2)
False
>>> math.sin(2),math.sin(2*math.pi + 2)
(0.90929742682568171, 0.90929742682568182)
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ja. Aber wo sollte da jetzt das Problem sein?
Das Leben ist wie ein Tennisball.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Jepp, genau. Das mußt Du natürlich berücksichtigen.

Ggf. kannst Du auch vorab in Polarkoordinaten transformieren. Je nachdem, was Du sonst noch vorhast, macht das Dein Leben einfacher oder schwieriger ;-).
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

INFACT hat geschrieben:Aber phi ist der winkel in rad oder?

Code: Alles auswählen

>>> math.sin(362) == math.sin(2)
False
Das sagt nun aber nicht unbedingt das aus, was du damit offenbar sagen willst. Guckst du hier:

Code: Alles auswählen

>>> from math import sin, radians
>>> sin(radians(2)) == sin(radians(362))
False
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Nebenbei sind erfahrungsgemäss solche Vergleiche wegen der Genauigkeit der Zahlen gefährlich. Da macht man dies lieber mit Versuchen.

Vor allem benutzt man in diesem Fall oft pi, wobei pi aber ja einen approximativen Wert besitzt, weshalb man so etwas erhalten würde:

Code: Alles auswählen

>>> from math import sin, pi
>>> sin(2)==sin(362)
False #Dann müsste es ja sin(rad) sein...
>>> sin(pi/3)==sin(2*pi/3)
False #Was nun?... rad gehen auch nicht =/
>>> sin(pi/3)
0.8660254037844386
>>> sin(2*pi/3)
0.86602540378443871 #siehe den kleinen Unterschied am Ende der Zahl (vermutlich da pi auf eine bestimmte Anzahl Stellen genau ist)
>>> sin(2*pi)
-2.4492935982947064e-16
>>> sin(0)
0.0
Beim Taschenrechner passiert das nicht... vermutlich sind dort Konstanten wie pi, e usw. auf irgendwie 10 Stellen mehr gespeichert, als "normale" Zahlen dann ausgegeben werden. (Oder sie werden durch immer direkt durch Algorithmen berechnet... aber das nehme ich mal nicht an)
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Ich habe aber noch ein problem:
Wie kann ich den den winkel ausmessen, wenn der mittelpunkt bei (0|0) liegt und ich den Punkt (0|30) und zb. (1|25) habe. Wie bekomme ich jetzt den winkel?
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das ist zwar mehr Mathematik als Python, aber informiere Dich einmal über das Skalarprodukt zweier Vektoren. Damit sollte das kein Problem mehr sein.
MfG
HWK
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Also... ich kanns dir mathematisch sagen, wie dus dann einsetzt weiss ich nicht ;).

Benennen wir die Punkte:
O = (0/0)
A = (0/30)
B = (1/25)

Dann ist z.b. OA der Vektor von O nach A.

OA = (0/30) = v, OB = (1/25) = w

Dazu nenne ich die X-komponente von OA mal v.x, bzw. die y-Komponente v.y.

Mithilfe der beiden Definitionen vom Skalarprodukt kannst du dann den Winkel finden. Ich erklärs mal nicht weiter, aber wenn dus nicht kennst kannst dus ja googeln.

Winkel zwischen den Vektoren: Phi

Phi = arccos((v.x*w.x + v.y*w.y)/(norm(v)*norm(w)))

norm() = Länge des Vektors... d.h. wurzel(Summer der Komponenten im Quadrat)

Das ganze geht übrigens auch in 3D. Du nimmst dann auch einfach wieder zwei Vektoren und hast dann halt noch v.z bzw. w.z
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Seeker hat geschrieben:Nebenbei sind erfahrungsgemäss solche Vergleiche wegen der Genauigkeit der Zahlen gefährlich.
Genau das sollte mein Beispiel ja zeigen - war aber zum selbst mitdenken ...
Seeker hat geschrieben:Vor allem benutzt man in diesem Fall oft pi, wobei pi aber ja einen approximativen Wert besitzt, weshalb man so etwas erhalten würde:
Das hat mit der Irrationalität von pi nichts zu tun, sondern mit der Fließkommadarstellung im allgemeinen.
Seeker hat geschrieben:Beim Taschenrechner passiert das nicht... vermutlich sind dort Konstanten wie pi, e usw. auf irgendwie 10 Stellen mehr gespeichert, als "normale" Zahlen dann ausgegeben werden.
Es gibt in dieser Hinsicht nicht "den" Taschenrechner. Das ist von Modell zu Modell unterschiedlich. Moderne wissenschaftliche Taschenrechner rechnen intern mit mindestens 13 Stellen; wenn man es geschickt anstellt, kommt man an die auch alle ran, auch wenn das Display nur 10 Stellen anzeigen kann.
INFACT hat geschrieben:Wie kann ich den den winkel ausmessen, wenn der mittelpunkt bei (0|0) liegt und ich den Punkt (0|30) und zb. (1|25) habe. Wie bekomme ich jetzt den winkel?
Vektoren brauchst du für diesen einfachen Fall nicht, schlichte Trigonometrie mit dem Tangens reicht hier aus (natürlich sind Vektoren die tragfähigere Lösung, gerade wenn es dir um 3-D geht, aber falls du mit Vektoren noch nie zu tun hattest, kommst du hier auch ohne aus).

Im konkreten (Sonder-)Fall genügt:

Code: Alles auswählen

>>> from math import atan2, degrees
>>> winkel = 90-degrees(atan2(25,1))
>>> print "%.2f°" %winkel
2.29°
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Bin ein Fan des biopython-Vectormoduls. Das ist zwar nicht das A&O, aber gibt einem einen allemal einen guten Einstieg ins Thema (allerdings, sollte man erst einmal die Mathematik zu verstehen versuchen, sonst kann man es für eigene Anwendungen nur schwer adaptieren.).

HTH
Christian
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Was sind denn die args von math atan2? Wie geht das wenn ich 1 20 und 2 15 habe. Ich kann mich nicht informieren weil ich am handy bin
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

INFACT hat geschrieben:Was sind denn die args von math atan2? Wie geht das wenn ich 1 20 und 2 15 habe. Ich kann mich nicht informieren weil ich am handy bin
Hä?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

INFACT hat geschrieben:Was sind denn die args von math atan2? Wie geht das wenn ich 1 20 und 2 15 habe. Ich kann mich nicht informieren weil ich am handy bin
Und für diese Antwort hast Du jetzt 2 Tage gebraucht?
MfG
HWK
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Wie lang kann man denn am Handy sein ^^?

Als Tipp: Zeichne dir ein Koordinatensystem, setze die Punkte ein.
Falls du nicht weisst, was der Tangens ist... naja, dann würde ich mich mal in Trigonometrie einlesen ;).
So kompliziert ises ned, es geht (sehr unmathematisch formuliert) jeweils um das Verhältnis zweier Seiten eines (meist) rechtwinkligen Dreiecks.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

HWK hat geschrieben:
INFACT hat geschrieben:Was sind denn die args von math atan2? Wie geht das wenn ich 1 20 und 2 15 habe. Ich kann mich nicht informieren weil ich am handy bin
Und für diese Antwort hast Du jetzt 2 Tage gebraucht?
Du kannst Beiträge mit diesen Handytasten schneller tippen? Also ich nicht :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Leonidas hat geschrieben:
HWK hat geschrieben:
INFACT hat geschrieben:Was sind denn die args von math atan2? Wie geht das wenn ich 1 20 und 2 15 habe. Ich kann mich nicht informieren weil ich am handy bin
Und für diese Antwort hast Du jetzt 2 Tage gebraucht?
Du kannst Beiträge mit diesen Handytasten schneller tippen? Also ich nicht :)
Von dieser Seite habe ich das natürlich noch gar nicht betrachtet. Na, dann ist ja alles klar. :lol:
MfG
HWK
Antworten